[javascript] 將模擬注入到AngularJS服務中


2 Answers

我看待它的方式,不需要自己嘲笑服務。 簡單地模擬服務的功能。 這樣,您就可以在整個應用程序中為您的實際服務注入角色。 然後,根據需要使用Jasmine的spyOn函數來模擬服務上的功能。

現在,如果服務本身是一個函數,而不是一個可以使用spyOn的對象,還有另一種方法可以解決它。 我需要做到這一點,並找到一些對我來說非常有用的東西。 請參閱如何模擬角色服務是一種功能?

Question

我寫了一個AngularJS服務,我想單元測試它。

angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']).
    factory('myService', function ($http, fooService, barService) {

    this.something = function() {
        // Do something with the injected services
    };

    return this;
});

我的app.js文件有這些註冊的:

angular
.module('myApp', ['fooServiceProvider','barServiceProvider','myServiceProvider']
)

我可以測試DI是如此工作的:

describe("Using the DI framework", function() {
    beforeEach(module('fooServiceProvider'));
    beforeEach(module('barServiceProvider'));
    beforeEach(module('myServiceProvder'));

    var service;

    beforeEach(inject(function(fooService, barService, myService) {
        service=myService;
    }));

    it("can be instantiated", function() {
        expect(service).not.toBeNull();
    });
});

這證明了服務可以由DI框架創建,然而接下來我想單元測試服務,這意味著嘲笑注入的對象。

我如何去做這件事?

我試過把我的模擬對象放在模塊中,例如

beforeEach(module(mockNavigationService));

並將服務定義重寫為:

function MyService(http, fooService, barService) {
    this.somthing = function() {
        // Do something with the injected services
    };
});

angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']).
    factory('myService', function ($http, fooService, barService) { return new MyService($http, fooService, barService); })

但後者似乎停止了由DI創建的服務。

有人知道我可以如何嘲笑我的單元測試注入的服務嗎?

謝謝

大衛




除了John Galambos的回答 :如果你只是想嘲笑服務的具體方法,你可以這樣做:

describe('Service: myService', function () {

  var mockDependency;

  beforeEach(module('myModule'));

  beforeEach(module(function ($provide, myDependencyProvider) {
      // Get an instance of the real service, then modify specific functions
      mockDependency = myDependencyProvider.$get();
      mockDependency.getSomething = function() { return 'mockReturnValue'; };
      $provide.value('myDependency', mockDependency);
  });

  it('should return value from mock dependency', inject(function (myService) {
      expect(myService.useDependency()).toBe('mockReturnValue');
  }));

});



我最近發布了ngImprovedTesting,它應該讓AngularJS的模擬測試變得更容易。

要測試'myService'(來自“myApp”模塊)及其fooService和barService依賴關係,您可以簡單地在Jasmine測試中執行以下操作:

beforeEach(ModuleBuilder
    .forModule('myApp')
    .serviceWithMocksFor('myService', 'fooService', 'barService')
    .build());

有關ngImprovedTesting的更多信息,請查看其介紹性博客文章: http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/ ://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/




Related