如何用mocha,chai,sinon测试angularJs中的$ q promises

时间:2016-05-25 03:48:15

标签: angularjs mocha karma-runner sinon chai

我们刚刚转到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'); }); 被调用的断言没有通过。我的测试有哪些变化才能通过?

1 个答案:

答案 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');
    );
});

这里发生了两件重要的事情:

  1. finally()可确保expect()dfd完全解决之前不会运行。
  2. finally()返回一个承诺,然后您将返回到Mocha测试本身。这告诉Mocha你正在处理异步代码,并阻止它继续进行进一步的测试,直到你的expect()已执行。您可以在Mocha here中阅读有关处理异步代码的更多信息。