Javascript 测试角分辨法
我的ui路由器有Angular,因此Javascript 测试角分辨法,javascript,angularjs,angular-ui-router,jasmine,karma-jasmine,Javascript,Angularjs,Angular Ui Router,Jasmine,Karma Jasmine,我的ui路由器有Angular,因此toResolve变量将在我的SomeController .state('some.state', { url: '/some', controller: 'SomeController', templateUrl: '/static/views/some-state.html', resolve: { toResolve: function(Resource) { retu
toResolve
变量将在我的SomeController
.state('some.state', {
url: '/some',
controller: 'SomeController',
templateUrl: '/static/views/some-state.html',
resolve: {
toResolve: function(Resource) {
return Resource.get(function(response) {
return response;
});
},
但是如何用Jasmine测试这个功能呢?让我们假设我忘记了
return
语句,因此我范围内的toResolve
将是未定义的。关于相关主题的一篇好文章是,但它不是解决方案。一个想法是将另一个对象传递给解析,然后分别测试代码单元,这在解析一组项目时很好。使用服务使解析程序能够有效地进行测试(在集成/e2e测试中也可以模拟)
注意:角度服务是单例服务,而状态/路由解析器不是
如果需要缓存解析,解析程序可能会移动到工厂
服务
app.factory('someResolver', function(Resource) {
return Resource.get(function(response) {
return response;
})
});
...
resolve: { toResolve: 'someResolver' },
另一方面,如果预期在每次路由更改时对解析器进行评估,这可能会导致不良的应用程序行为。在这种情况下,适当的配方可能是常量
注释函数:
app.constant('someResolver', ['Resource', function(Resource) {
return Resource.get(function(response) {
return response;
})
}]);
app.config(function (someResolver, ...) {
...
resolve: { toResolve: someResolver },
...
否则,规范可能会以一堆样板代码结束:
var toResolveFactory = $state.get('some.state').resolve.toResolve;
var toResolve = $injector.invoke(toResolveFactory);
为什么要测试内部AngularJS功能,可能它的工作方式非常完美它不是内部的,而是一个简单的测试用例,比如
expect($scope.toResolve).not.tobeundefine()代码>当我可能错过返回的时间example@KrzysztofSafjanowski:无论如何,一切都必须是可测试的,如果我想,我应该能够模拟任何组件并测试这些组件的任何组合,不管它是内部的还是不好的,这正是我想要的。另一个小问题是:我的规范中的$injector
从何而来?@mostwaint您需要将$injector
服务注入规范中,以测试常量和$state。获取…
解析程序的味道(对于工厂来说不是必需的)。