![](/img/trans.png)
[英]Angular 6 Testing Jasmine Karma: Override Provider Not working
[英]Angular JS Testing with Karma Jasmine
我有这样的示例路线 :
angular
.module('appRouter',['ui.router'])
.config(function($stateProvider,$urlRouterProvider){
$stateProvider
.....
.....
.state('settings.account',{
url:'/account',
templateUrl:'templates/account.html',
controller:function(resolveData){
console.log(resolveData);
},
resolve:{
resolveData : function($http){
var root = 'https://jsonplaceholder.typicode.com';
return $http.get(root+'/posts/1').then(function(response){
return response.data;
});
}
}
});
.....
它只是一个测试URL,我可以在线获取示例JSON数据
https://jsonplaceholder.typicode.com/posts/1
我想测试一下状态。
beforeEach(function(){
module('appRouter');
});
beforeEach(inject(function(_$rootScope_,_$injector_,_$state_,_$httpBackend_,$templateCache){
$rootScope = _$rootScope_;
$state = _$state_;
$injector = _$injector_;
$httpBackend = _$httpBackend_;
$templateCache.put('templates/account.html','');
}));
it('should resolve "resolveData"',function(){
const state = $state.get('settings.account');
const resolveFn = state.resolve.resolveData;
$httpBackend.whenGET('https://jsonplaceholder.typicode.com/posts/1').respond(function(){
return [
200,{
"userId": 1,
"id": 1,
"title": "...",
"body": "..."
}]
});
$httpBackend.expectGET('https://jsonplaceholder.typicode.com/posts/1');
$injector.invoke(resolveFn);
$httpBackend.flush();
expect($injector.annotate(resolveFn)).toEqual(['$http']);
console.log(angular.mock.dump($scope));
expect($scope.resolveData).toEqual({
"userId": 1,
"id": 1,
"title": "...",
"body": "..."
});
但这失败了。 话
1) should resolve "resolveData"
UI Routerer Config For Account
Expected undefined to equal Object({ userId: 1, id: 1, title: '...', body: '...' }).
at Object.<anonymous> (test/controllers/main-controller-spec.js:114:36)
我究竟做错了什么 ?
UPDATE
console.log(angular.mock.dump($scope));
给出以下内容
请帮忙。
原始错误:
should resolve "resolveData"
UI Routerer Config For Account
TypeError: Cannot read property 'get' of undefined
at resolveData (app/appRouter.js:25:41)
at Object.<anonymous> (test/controllers/main-controller-spec.js:97:9)
我究竟做错了什么?
您在单元测试中调用resolveFn()
。 该函数被定义为需要$http
服务,并且该调用不传递$http
服务(如提到的fingerpich )。
要更正此问题,请允许angular使用$injector.invoke(resolveFn)
来处理依赖项注入。
用插头看这个动作。 请注意,测试确实因其他原因而失败。 但是,(如果我理解正确的规则)这是一个不同的问题应该回答一个不同的问题(如果你需要更多的帮助)。
旁注:当在浏览器中打开站点(而不是单元测试)时,我希望它能够正常工作,因为angular会将$http
依赖项注入分配给resolveData
的函数中。
看看也引用了fingerpich提到的博客的答案 。
这是我在学习单元测试AngularJS时发现的一个博客。
should resolve "resolveData"
UI Routerer Config For Account
TypeError: Cannot read property 'get' of undefined
at resolveData (app/appRouter.js:25:41)
at Object.<anonymous> (test/controllers/main-controller-spec.js:97:9)
要解决这个问题,你应该将$http
传递给resolveData函数。
resolveFn($http);
但最好写这样的测试此
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.