单元测试AngularJS服务导致未知的提供程序错误

时间:2014-05-08 19:02:33

标签: angularjs unit-testing

我正在为AngularJS服务添加单元测试,该服务返回类似于此示例的构造函数:

 angular.module('utilities', []).
     factory('Toy', [function () {

         var Toy = function (arg) {
             this.arg = arg;
             this.isActive = true;
         };

         Toy.prototype.stop = function () {
             this.isActive = false;
         };

         return Toy;
     }]);

这是目前的Jasmine规范:

 describe('toy-service tests', function () {

     var toyFactory, toy;

     beforeEach(function () {
         module('utilities');
         inject(function($injector) {
             toyFactory = $injector.get('Toy');
         });
     });

     it('should create a new utilities.Toy instance', function () {
         toy = new toyFactory(1);
         expect(toy).toBeDefined();
         expect(toy.arg).toEqual(1);
         expect(toy.isActive).toBeTruthy();
     });
 });

由于'错误:未知提供商:ToyProvider< - 玩具'

,单元测试失败

经过一天阅读其他单元测试帖后,我仍然不知道为什么。有什么建议吗?

其他信息:

我将此服务定义和规范转换为angular-phonecat副本中的测试脚本。令我惊讶的是,测试在angular-phonecat中运行时没有应用任何建议的更改。

错误原因:

错误是由于我对AngularJS的新见解以及在多个文件中向实用程序模块添加服务。我正在重新定义每个源文件中的实用程序模块,从而消除其先前的属性。只有按字母顺序排列的最后一个源文件的实用程序模块定义才可用于测试。因为toy-service.js不是最后一个源文件,所以玩具服务不可用。

玩具测试在angular-phonecat中工作,因为该应用程序中没有其他实用程序模块文件。

感谢Mark Sheretta帮助我调试此问题。

2 个答案:

答案 0 :(得分:3)

试试这样:

beforeEach(module('utilities'));

beforeEach(inject(function(Toy) {
   toyFactory = Toy;
}));

答案 1 :(得分:0)

致电时使用的模块功能

beforeEach(module('utilities'));

在angular-mocks中定义,而不是在核心Angular库中定义。因此,在运行此测试时,您需要确保测试运行器加载了angular-mocks.js文件。

如上所述,在配置我的测试运行器后,我能够成功运行此测试。