我们刚刚转到mocha,chai和sinon为我们的测试库而来自茉莉花我对如何测试承诺感到有些困惑。
我有一个调用服务的表单提交函数,并在返回时将用户导航到正确的状态:
$var = (3 / 2);
echo floor($var); // 1
echo ceil($var); // 2
通过以下测试已经完成了部分工作:
submit(event, theForm){
event.preventDefault();
if(theForm.$valid){
this.AuthenticationService.authenticateUser({
email: this.email,
password: this.password
}).then( (result) => {
this.$state.go('dashboard.home')
});
}
}
但是it('should submit the login credentials if valid', function(){
var dfd = q.defer(),
promise = dfd.promise;
controller.email = 'ryan.pays@leotech.com.sg';
controller.password = 'Password123';
sinon.stub(service, 'authenticateUser').returns(promise);
sinon.spy(state, 'go');
sinon.spy(controller, 'submit');
controller.submit(event, theForm);
dfd.resolve();
expect(controller.submit).to.have.been.called;
expect(controller.submit).to.have.been.calledWith(event, theForm);
expect(event.preventDefault).to.have.been.called;
expect(service.authenticateUser).to.have.been.called;
expect(service.authenticateUser).to.have.been.calledWith({
email: controller.email,
password: controller.password
});
expect(state.go).to.have.been.called;
expect(state.go).to.have.been.calledWith('dashboard.home');
});
被调用的断言没有通过。我的测试有哪些变化才能通过?
答案 0 :(得分:0)
可能这是一个计时问题,在执行控制器expect()
之前调用then()
。要解决此问题,请尝试将state.go
断言包含在finally()
中,如下所示:
it('should submit the login credentials if valid', function(){
[...]
return promise.finally(function() {
expect(state.go).to.have.been.called;
expect(state.go).to.have.been.calledWith('dashboard.home');
);
});
这里发生了两件重要的事情:
finally()
可确保expect()
在dfd
完全解决之前不会运行。finally()
返回一个承诺,然后您将返回到Mocha测试本身。这告诉Mocha你正在处理异步代码,并阻止它继续进行进一步的测试,直到你的expect()
已执行。您可以在Mocha here中阅读有关处理异步代码的更多信息。