繁体   English   中英

使用Karma Jasmine进行Angular JS测试

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

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