如何注入app.run函数中使用的模拟角度服务?

时间:2014-05-19 07:34:08

标签: javascript angularjs unit-testing mocking

我在我的角度应用程序中添加了一些身份验证逻辑,最初调用包装webapi的服务在app.run函数中执行,如下所示:

myApp.run(function ($rootScope, $location, myService) {

myService.getCurrentUser().then(function (promise) {
    //reroute to either access denied or the start page when access is verified.

});

// register listener to watch route changes
$rootScope.$on("$routeChangeStart", function (event, next, current) {

    //check access
}); 
});

在此之后我的所有单元测试都破了,因为在创建app模块之前我不知道如何注入模拟版本的myService。我在一个单独的模块中考虑了服务和模拟服务,因此我可以在创建实际应用程序之前创建它。像这样:

   angular.mock.module('ServiceModule');

    angular.mock.module('EArkivApp', function ($provide, myMockedService) {
        $provide.value('myService', myMockedService);
    });

但这不起作用,它抱怨" myMockedService" (它是ServiceModule的一部分)是一个未知的提供者。你对我应该如何解决这个问题有什么好的建议吗?

1 个答案:

答案 0 :(得分:0)


你能为我们提供一个jsfiddle吗? 同时,如果您使用的是Karma,那么您可以使用以下内容:

/*global  describe, beforeEach, module, inject, it, expect*/
describe('Controller: MyCtrl', function () {
  'use strict';
  // load the controller's module
  beforeEach(module('myApp'));

  var MyCtrl,
      scope,
      modalInstance;

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope, myMockedService) {
     scope = $rootScope.$new();
      modalInstance = _$modal_.open({
              templateUrl: 'views/my-template.html'
          });
      MyCtrl = $controller('MyCtrl', {
          $scope: scope, 
          $myMockedService: myMockedService
      });
  }));

  it('should be true', function () {
      expect(true).toBe(true);
  });
});

顺便说一句,我通过使用Yeoman脚手架来学习这个:)