Node.js 使用Jest和Sinon测试具有属性的函数

Node.js 使用Jest和Sinon测试具有属性的函数,node.js,jestjs,sinon,Node.js,Jestjs,Sinon,我试图在我的应用程序上编写测试流的测试,使用createWriteStream函数处理fs库,因此我创建的存根如下所示: writeStreamStub = sinon.stub() onceStreamEventStub = sinon.stub() endStreamStub = sinon.stub() onStreamStub = sinon.stub() createStreamStub = sinon.stub(fs, 'createWriteStream').returns({

我试图在我的应用程序上编写测试流的测试,使用
createWriteStream
函数处理
fs
库,因此我创建的存根如下所示:

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
方法是在
进程内调用的。nextTick
我不知道该怎么做。是否有可能涵盖整个代码和回调中的代码,如果有,我该怎么做。提前谢谢


N.B.变量是全局声明的

如果没有充分的理由同时使用sinon和jest,我建议只使用一个库。如果你决定开玩笑,这里有一个简单的例子。假设你有一个像

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));
}

不清楚你的实际问题是什么,也不清楚你在说“如何着手”时指的是什么。请提供其他详细信息。@Romihalaz我试图做的是测试回调函数中的代码,例如,在调用
stream.on('error',function(){})
时,现在我想让jest检查一下匿名函数中的代码谢谢,这非常清楚,但是,考虑到我在
process.nextTick
内部调用
write
,它会等待调用吗?还是我需要做一些额外的步骤让它等待,如果是,我该怎么做才能让它等待呢?我已经编辑了示例-你确实需要等待下一个勾号完成。也许有比我等待承诺更好的方法,但它应该是这样的。