如何在Jasmine的承诺之后测试代码中的代码?

时间:2015-07-19 13:00:17

标签: javascript angularjs unit-testing jasmine

我有下面的代码,我想尽可能地测试它。我只是摸不着头脑如何在authenticationService.authenticate()的那个区块内测试那两行。我来回搜索,但我找不到任何有用的信息。

当我检查广播是否被触发时,结果是假的,因为最初有一条广播消息会触发整个代码。

function shellController($location, $rootScope, $scope, authenticationService, authService, common)
    {
        $scope.$on('event:auth-loginRequired', function ()
        {

            var user = {
                userName: 'visitor',
                password: 'visitor'
            };

            authenticationService.authenticate(user).then(function (result) {

                $rootScope.$broadcast('event:username-changed');

                authService.loginConfirmed();
            });

        });
    }

authenticationService.authenticate()成功返回时,我如何模拟它 - 它不是测试的对象是否成功返回 - 以及是否调用了$rootScope.$broadcast('event:username-changed'); - 这是测试对象?< / p>

2 个答案:

答案 0 :(得分:1)

测试承诺的要点是知道可以通过执行[[:space:]]来解决或拒绝承诺。另一点是模拟返回promise的特定函数返回的promise(通过返回已解析的promise或被拒绝的promise)。通过这样做,为您提供控制测试流程的工具。下面的测试向您展示了如何执行此操作:

<强> DEMO

<强> script.spec.js

$rootScope.$digest()

答案 1 :(得分:0)

您想测试承诺行为还是仅测试成功回调中的逻辑?

如果它只是回调,那么我会从一个匿名函数转移到它自己的函数,并在没有承诺的情况下测试它。

否则我认为您可以在测试中使用$ httpBackend来触发承诺。