[英]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.