2015-04-03 82 views
0

我对angular/jasmine/karma非常陌生,而且我无法为我的控制器写一个测试。测试本身运行成功,但在试运行,我发现了以下错误:试图用茉莉花来测试一个角度控制器 - 错误

Error: userFactory() method does not exist 

userFactory()是在我的控制器作出返回一个承诺的服务的方法调用。我不确定如何确保在测试中正确定义了这一点。

这里是我的代码:

app.js

(function() { 
    angular.module('mdotTamcCouncil', ['mdotTamcCouncil.core', 'blurb']); 

    angular.module('mdotTamcCouncil.core', []); 
})(); 

Blurb的-service.js

(function() { 
    angular.module('mdotTamcCouncil.core').factory('blurbsFactory', function ($http) { 
     var promise = null; 

     return function() { 
      if (promise) { 
       // If we've already asked for this data once, 
       // return the promise that already exists. 
       return promise; 
      } else { 
       promise = $http.get(jsGlobals.blurbsDataURL); 
       return promise; 
      } 
     }; 
    }); 
})(); 

用户service.js

(function() { 
    angular.module('mdotTamcCouncil.core').factory('userFactory', function ($http) { 
     var promise = null; 

     return function() { 
      if (promise) { 
       // If we've already asked for this data once, 
       // return the promise that already exists. 
       return promise; 
      } else { 
       promise = $http.get(jsGlobals.userDataURL); 
       return promise; 
      } 
     }; 
    }); 
})(); 

Blurb的-controller.js

(function() { 
    angular.module('blurb') 
      .controller('BlurbController', ['$scope', 'blurbsFactory', 'userFactory', function ($scope, blurbsFactory, userFactory) { 
       $scope.content = ""; 
       $scope.blurbs = {}; 
       $scope.currentUser = {}; 
       this.editMode = false; 


       userFactory().success(function (data) { 
        $scope.currentUser = data; 
       }); 

       blurbsFactory().success(function (data) { 
        $scope.blurbs = data; 
        $scope.content = $scope.blurbs[$scope.textKey]; 
       }); 

       this.enterEditMode = function() { 
        this.editMode = true; 
       }; 

       this.saveEdits = function() { 
        this.editMode = false; 
        $scope.blurbs[$scope.textKey] = $scope.content; 
       }; 
      }]); 

})(); 

Blurb的-module.js

(function() { 
    'use strict'; 
    angular.module('blurb', ['ngSanitize', 'mdotTamcCouncil.core']); 

})(); 

和我的测试规范:

describe('BlurbController', function() { 
    var scope, controllerService; 

    beforeEach(module('mdotTamcCouncil')); 
    beforeEach(module('mdotTamcCouncil.core')); 
    beforeEach(module('blurb')); 

    beforeEach(inject(function ($rootScope, $controller) { 
     scope = $rootScope.$new(); 
     controllerService = $controller; 
    })); 

    it("should get 'user' from 'data/user.json'", inject(function ($httpBackend) { 
     $httpBackend.expectGET("data/user.json").respond({"userName": "myera","email": "[email protected]","isAdmin": true}); 
     $httpBackend.expectGET("data/blurbs.json").respond('{"mainPageIntro": "<h2>Welcome</h2>"}'); 
     ctrl = controllerService('BlurbController', { $scope: scope }); 
     $httpBackend.flush(); 
     expect(scope.currentUser).toEqual({"userName": "myera","email": "[email protected]","isAdmin": true}); 
     expect(scope.blurbs).toEqual({ "mainPageIntro": "<h2>Welcome</h2>" }); 
    })); 
}); 

我这个拼凑一起阅读博客和sta ckoverflow的答案。我不确定我是否做得正确。

测试本身实际上已通过,但我在控制台中发现有关缺少“userFactory()”方法的错误。我假设我也会得到“blurbFactory()”方法的消息。我不相信我可以在没有首先解决这些错误的情况下测试控制器的实际功能。

我在做什么错?非常感谢您提供的任何帮助。

回答

0

我相信你看到的问题是因为你没有在blurb模块中包含'mdotTamcCouncil.core'模块作为依赖项。当定义它,你应该使用

angular.module('blurb', ['mdotTamcCouncil.core']); 

因为执行时userFactory()失败阻止你只得到了一个控制台错误能够在依赖列表来传递。我不确定为什么测试显示为传球,它应该拿起例外并失败 - 对于您选择的测试跑步者来说可能是一个怪事。

+0

非常感谢您的反馈,@ Travis。不幸的是,我的blurb模块中定义了“mdotTamcCouncil.core”。我已更新我的问题以显示blurb-module.js的内容。再次感谢! – 2015-04-03 13:58:39

+0

不幸的是我不确定我会得到更多的帮助。我将你的样本插入到一个快速测试项目中,我碰到的唯一问题是blurb模块没有正确加载。我通过改变模块的创建方式解决了这个问题。本质上,我删除了blurb模块文件并更新了blurb控制器以在那里实例化模块。一旦这个问题得到解决,测试就会运行并且不会出现控制台错误。 – Travis 2015-04-03 14:39:38

+0

谢谢你吨!我在模块声明的制作地点玩弄了一下,最终让它工作。我想知道如果我的业力测试跑步者没有正确加载blurb-module.js。修改karma配置后,我重新启动它,然后运行。尽管你让我走上正轨。谢谢。 =) – 2015-04-03 14:51:53