JavaScript-使用Mocha测试

时间:2019-07-19 22:57:46

标签: javascript unit-testing testing mocha

我正在测试以下功能:

module.exports = {

    post: function myFunc(req, res) {
        some logic...
        ...
        ...
        res.json(ObjectToReturn);

}
}

我正在尝试像这样使用Mocha进行测试:

  it("some test", function() {

      const response = myModule.post(
                           { reqPayLoad }, 
                           {}
                              );
      console.log(response)
  });

但是我不断收到错误消息:

  

res.json不是函数

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

传递给post的对象文字为空:{}

要对此进行测试,您需要对其进行模拟。

myModule.post(
    { reqPayLoad }, 
    { json: () => {} }
);

这里还有另一个问题。您的post方法实际上不会返回任何内容,因此response将是未定义的。

相反,将调用res.json()将数据发送回客户端,因此您需要检查正在调用的内容。

您可以修改模拟的json方法以记录结果:

myModule.post(
    { reqPayLoad }, 
    { json: data => console.log(data) }
);

不过,为了实际测试post的返回值,您可能需要使用Sinon spies之类的东西,才能检查以编程方式调用了res.json()。

let jsonSpy = sinon.spy();
myModule.post(
    { reqPayLoad }, 
    { json: jsonSpy }
);

assert(jsonSpy.calledWith(ObjectThatWasReturned));

更新

如果post方法是异步的,则还需要一些方法来等待它完成。我认为,最简单的方法是使用async/await

    // async makes the function return a promise
    post: async function myFunc(req, res) {
        some logic...
        ...
        ...
        res.json(ObjectToReturn);

}

然后,我们等待测试中的承诺:

  // Note: we set this function as async as well
  it("some test", async function() {

    let jsonSpy = sinon.spy();
    // wait for the promise to resolve
    await myModule.post(
        { reqPayLoad }, 
        { json: jsonSpy }
    );

    assert(jsonSpy.calledWith(ObjectThatWasReturned));
  });

使用回调更新

查看有关测试异步代码的Mocha文档。这是一个示例:

it("some test", function(done) {

    // wait for the promise to resolve
    await myModule.post(
        { reqPayLoad }, 
        { 
            json: returnObject => {
                assert(returnObject).toEqual('some_object')
                done()
            } 
    }
    );
  });