如何解决使用 mocha 和 sinon 的 EventEmitter 单元测试不起作用
我的代码“expect(spy.Called).to.be.true”的部分应该是真的。但是测试结果是这样的。
AssertionError: expected false to be true
+ expected - actual
-false
+true
我尝试用 mocha 对 EventEmitter 进行单元测试。很快,我意识到我需要检查监听器函数是否被调用。所以我导入了 sinon 模块。但我所期望的一切都没有发生在我身上。 我的代码如下。请让我知道我的代码有什么问题。非常感谢。
const findPattern = require('./findPatterns');
const expect = require('chai').expect;
const sinon = require('sinon');
const FakeTimers = require('@sinonjs/fake-timers');
describe('findPattern',function() {
const sampleFiles = ['./sample/sample1.txt','./sample/sample2.txt','./sample/sample3.txt'];
const regEx = /[0-9]+/g;
it('findPattern',function() {
const clock = FakeTimers.createClock();
const o = {
f: (file) => console.log('Read from ' + file)
};
const spy = sinon.spy(o,"f");
findPattern(sampleFiles,regEx)
.on('error',(err) => console.log('error: ' + err))
.on('read',spy)
.on('found',(file,match) => console.log('Matched ' + match + ' in file' + file));
clock.setTimeout(function() {
expect(spy.called).to.be.true;
},1000);
clock.tick(1000);
});
});
const EventEmitter = require('events');
const fs = require('fs');
function findPattern(files,regex) {
const emitter = new EventEmitter();
files.forEach(function(file) {
fs.readFile(file,"utf-8",(err,content) => {
if (err) {
return emitter.emit('error',err);
}
emitter.emit('read',file);
const matches = content.match(regex);
if (matches) {
matches.forEach(i => {
emitter.emit('found',file,i);
});
}
});
});
return emitter;
}
module.exports = findPattern;
解决方法
好吧,我想我找到了一种解决方案。我想问题出在异步问题上。 “期望函数”似乎在完成读取文件之前被调用。 所以我改变了我的代码并得到了我预期的结果。顺便说一下,计时器功能似乎无法正常工作。如果我做错了什么,请检查我更改的代码并提供一些建议。
const findPattern = require('./findPatterns');
const expect = require('chai').expect;
const sinon = require('sinon');
describe('findPattern',function() {
const sampleFiles = ['./sample/sample1.txt','./sample/sample2.txt','./sample/sample3.txt'];
const regEx = /[0-9]+/g;
const readFun = (file) => console.log('Read from ' + file);
const o = {
f: readFun
};
const spy = sinon.spy(o,"f");
beforeEach(function(done) {
findPattern(sampleFiles,regEx,done)
.on('error',(err) => console.log('error: ' + err))
.on('read',spy)
.on('found',(file,match) => console.log('Matched ' + match + ' in file' + file));
});
it('findPattern',function() {
expect(spy.called).to.be.true;
});
});
const EventEmitter = require('events');
const fs = require('fs');
function readFile(file,regex,emitter,callback) {
fs.readFile(file,"utf-8",(err,content) => {
if (err) {
return emitter.emit('error',err);
}
emitter.emit('read',file);
const matches = content.match(regex);
if (matches) {
matches.forEach(i => {
emitter.emit('found',file,i);
});
}
callback();
});
}
function findPattern(files,done) {
const emitter = new EventEmitter();
let completed = 0;
function finish() {
if (++completed == files.length) {
return done();
}
}
files.forEach(function(file) {
readFile(file,finish);
});
return emitter;
}
module.exports = findPattern;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。