繁体   English   中英

带有位置侦听器的单元测试$ q(角度)

[英]Unit Testing $q with location listener (Angular)

我有一个控制器,可以做两件事:

1)履行诺言时执行一个函数($ q.then)

2)在触发'onLocationChangedStart'事件时执行一个函数

在单元测试中,我想测试(1)的功能。 我通过执行$RootScope.$apply()来触发promise决议来做到这一点。 不幸的是,事实证明$rootScope.$apply()还会发出一个'onLocationChangedStart'事件,其中url = http://server/ (这在角度代码内)。

显然,这是一个问题,因为它将触发(2),即使这不是我对此特定单元测试所想要的。

是否有任何简单的方法可以解决此问题,而不必为了使单元测试运行而修改原始代码? (例如,我可以将函数(2)放在$scope ,然后在运行测试之前将其模拟为null。但这似乎有点黑。)

更新了清理的代码示例:

angular.module('myMod')

.controller("ctrl", function ($scope, $log, myService, $location) {

     myService.doSomething()
           .then(function () {
               //does something

           })

       })


    $scope.$on('$locationChangeStart', routeChange);

    function routeChange(event, currentUrl, nextUrl) {
           //does something
    };

})

//Jasmine unit test
describe('test', function () {
    var $scope,
         ctrl,
         $rootScope;


    beforeEach(function () {

        module("myMod");
          module("myServiceMock");


        inject(function (_$rootScope_, $controller, _myService_) {
            $rootScope = _$rootScope_;
            $scope = $rootScope.$new();


            ctrl = $controller('ctrl', {
                $scope: $scope

            });


        });
    });


    it("Should set startup values appropriately", inject(function () {

        //doing this triggers both the myService promise AND the location event listener
        $rootScope.$apply();



}));

您可以使用$scope.$digest()代替$scope.$apply() $digest()仅在当前作用域上执行监视的表达式,而$apply()运行$rootScope.$digest()

it("Should set startup values appropriately", function() {
   $scope.$digest();
   // promise resolved
   // onLocationChangedStart event not fired
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM