我正在尝试编写测试来测试我的应用程序上的流,使用其 createWriteStream
函数处理 fs
库,因此我创建的 stub 如下:
writeStreamStub = sinon.stub()
onceStreamEventStub = sinon.stub()
endStreamStub = sinon.stub()
onStreamStub = sinon.stub()
createStreamStub = sinon.stub(fs, 'createWriteStream').returns({
write: writeStreamStub,
once: onceStreamEventStub,
end: endStreamStub,
on: onStreamStub
})
现在我可以测试函数是否被调用以及返回的函数是否也被调用。但我使用的是 --coverage
标志,并且返回函数的回调代码没有被覆盖,write
方法是在 process.nextTick
内部调用的,我不知道如何处理这个问题。是否可以覆盖整个代码和回调内的代码,如果可以,我该怎么做。提前致谢。
注意变量是全局声明的
最佳答案
如果没有令人信服的理由同时使用 sinon 和 jest,我建议只使用一个库。如果您决定开 Jest ,这里有一个简单的例子。假设你有一个像这样的类(class)
const fs = require('fs');
module.exports = class FileWriter {
constructor() {
this.writer = fs.createWriteStream('./testfile.txt');
}
writeFile() {
process.nextTick(() => {
this.writeContent('hello world');
});
}
writeContent(content) {
this.writer.write(content);
this.writer.end();
}
};
并且在单元测试中,您想要模拟所有使用的 fs 函数(在本例中为 createWriteStream、writer、end)的行为,并检查是否使用正确的参数调用它们。你可以用这样的东西来做到这一点:
const fs = require('fs');
const FileWriter = require('./FileWriter');
// use this to have mocks for all of fs' functions (you could use jest.fn() instead as well)
jest.mock('fs');
describe('FileWriter', () => {
it('should write file with correct args', async () => {
const writeStub = jest.fn().mockReturnValue(true);
const endStub = jest.fn().mockReturnValue(true);
const writeStreamStub = fs.createWriteStream.mockReturnValue({
write: writeStub,
end: endStub,
});
const fileWriter = new FileWriter();
fileWriter.writeFile();
await waitForNextTick();
expect(writeStreamStub).toBeCalledWith('./testfile.txt');
expect(writeStub).toBeCalledWith('hello world');
expect(endStub).toHaveBeenCalled();
});
});
function waitForNextTick() {
return new Promise(resolve => process.nextTick(resolve));
}
关于node.js - 使用 Jest 和 Sinon 测试具有属性的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282415/