如何模拟控制器加载时立即调用的服务?

时间:2014-10-28 16:40:45

标签: angularjs jasmine karma-jasmine

我有一个控制器,可以在加载时立即从服务中获取一些数据。

angular.module('app').controller("MyController", function (myService) {
    var projectId = myservice.project.id;
});

此数据是从应用程序中的上一个操作设置的。因此,当karma / jasmine将此控制器加载到新状态时,此服务不会拥有此数据。我曾尝试在beforeEach区块中嘲笑这项服务,但没有任何运气。

beforeEach(function () {
    var myService = {
        project: {
            id: 'thadsfkasj'
        }
    }
});

我错过了什么?

3 个答案:

答案 0 :(得分:0)

您可以使用angular.value模拟您的服务。这应该允许您将myService注入您的控制器。

angular.module('myServiceMock', [])
    .value('myService',
    {
        project: {
            id: 'thadsfkasj'
        }
    });

beforeEach(module(
    'myServiceMock'
    //other modules or mocks to include...
));

答案 1 :(得分:0)

你也在使用ngMock吗?

如果是这样,您应该执行以下操作:

beforeEach(module(function ($provide) {
    var myService = {
        project: {
            id: 'thadsfkasj'
        }
    }
    $provide.value('myService', myService);
}));

Test AngularJS factory function with Jasmine

答案 2 :(得分:0)

无需处理注入$ provide或overriding模块,只需在测试中实例化控制器时传入代表模拟的对象。

beforeEach(inject(function (_$controller_) {
  myMockService = {
    project: {
      id: 100
    }
  };

  ctrl = _$controller_('MyController', {
    ...
    myService: myMockService
    ...
  });
}));