[javascript] AngularJS 서비스에 모의 삽입



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');
  }));

});



나는 AngularJS 방식으로 모의 테스트를 더 쉽게 만들어야하는 ngImprovedTesting을 최근에 릴리스했습니다.

fooService 및 barService 종속성을 사용하여 'myService'( "myApp"모듈에서 테스트)를 간단한 방법으로 조롱하면 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/ 확인하십시오.




Links