【发布时间】:2016-02-25 02:25:46
【问题描述】:
假设我在一个名为 UserController 的类中有一个函数,它按照这些思路执行某些操作(userService.createUser() 返回一个承诺):
function createUser(req, res)
{
const userInfo = req.body;
userService.createUser(userInfo)
.then(function(){res.json({message: "User added successfully"})})
.fail(function(error){res.send(error)})
.done();
}
如何测试,当 promise 解决时,res.json() 被调用,当 promise 被拒绝时,res.send(error) 被调用?
我试过写一个这样的测试:
const userService = ...
const userController = new UserController(userService);
const response = {send: sinon.stub()};
...
const anError = new Error();
userService.createUser = sinon.stub().returns(Q.reject(anError));
userController.createUser(request, response);
expect(response.send).to.be.calledWith(anError);
但测试失败,“response.send is never called”。我还尝试在调用 res.send(error) 之前记录一些内容,并且记录确实发生了。
我的猜测是 expect() 在执行 res.send(error) 之前被调用,因为它是异步的。
我对 Promise 和单元测试还很陌生,这与我的架构或我对 Promise 的使用有关吗?
我将 Q 用于 Promise,使用 mocha、chai、sinon 进行单元测试。
【问题讨论】:
标签: javascript node.js unit-testing promise mocha.js