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

标签 node.js jestjs sinon

我正在尝试编写测试来测试我的应用程序上的流,使用其 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/

相关文章:

node.js - node_modules 文件夹中有许多未知模块

node.js - Node.js 服务器如何对并发请求进行排队

node.js - 从node.js中的wsdl生成请求xml

node.js - 如何获取React和ReactDOM的ES6模块?

javascript - 如何在 Jest 中模拟 Webpack 的 require.context?

reactjs - 如何模拟实际上是 Redux 的连接 Action 创建者的 Prop ?

使用 Jasmine 和 Sinon 测试主干模型 - 对象 #<Object> 没有方法 'spy'

reactjs - 开 Jest ,没有预处理我的 JSX

javascript - 是否有等效的方法来设置模拟实现,而不是使用 jest 的 __mocks__ 目录方法?

javascript - Mocha JS 测试 - 一种对 sinon spy 进行回调的方法