2012-07-12 28 views
21

Tôi đang thử kiểm tra bộ điều khiển phụ thuộc vào dịch vụ mà tôi tự xây dựng. Tôi muốn thử dịch vụ này kể từ khi dịch vụ nói chuyện với DOM.Tiêm dịch vụ giả lập để kiểm tra bộ điều khiển góc cạnh

Dưới đây là thử nghiệm hiện tại của tôi:

describe('Player Controllers', function() { 

    beforeEach(function() { 
     this.addMatchers({ 
      toEqualData: function (expected) { 
       return angular.equals(this.actual, expected); 
      } 
     }); 
    }); 

    describe('TestPSPlayerModule', function() { 
     var $httpBackend, scope, ctrl; 

     beforeEach(module('PSPlayerModule')); 

     beforeEach(inject(function (_$httpBackend_, $rootScope, $controller) { 
      $httpBackend = _$httpBackend_; 

      scope = $rootScope.$new(); 
      ctrl = $controller(PlayerController, { $scope: scope }); 
     })); 

     it('should request a clip url from the server when clipClicked is called', function() { 
      expect(1).toBe(1); 
     }); 
    }); 

}); 

điều khiển của tôi trông như thế này:

w.PlayerController = function ($scope, $http, $window, speedSlider, $location) { 
    ... 
} 

vì vậy các speedSlider Tôi muốn thử.

tôi nảy ra ý tưởng sử dụng một mô-đun Tôi tạo ra trong mã thử nghiệm của tôi có thể cung cấp một thực hiện giả của thanh trượt tốc độ, vì vậy tôi đã thêm dòng sau vào phía trên cùng của test.js file:

module('TestPSPlayerModule', []).factory('speedSlider', function() { 
    return = { 
     ... 
    }; 
}); 

và sau đó liệt kê rằng mô-đun trong beforeEach() gọi thay vì một bê tông, nhưng nếu tôi làm điều đó tôi nhận được lỗi sau:

Injector already created, can not register a module! 

vì vậy, tôi tìm có phải là một cách tốt hơn cho tôi để cung cấp một thử thực hiện một trong các dịch vụ của tôi. Tôi có thể sử dụng sinon.js cho ....

+0

Bạn đã xem tài liệu này chưa? http://docs.angularjs.org/guide/dev_guide.services.testing_services Trong đó '$ window' bị loại bỏ. Đây là một ví dụ khá đơn giản, nhưng nó có thể cung cấp một mẫu cho những gì bạn muốn làm. –

+0

@NoahFreitas Liên kết bạn cung cấp hiện đã chết – Stephane

+1

@StephaneEybert, có vẻ như đã được chuyển đến và cập nhật tại đây: https://docs.angularjs.org/guide/services#unit-testing –

Trả lời

6

Đảm bảo khi bạn sử dụng mô-đun sau khi định nghĩa của nó mà bạn không có dấu ngoặc phụ. Vì vậy, module('TestPSPlayer') thay vì module('TestPSPlayer',[]).

40

Ngoài ra hãy chắc chắn bạn không cố gắng để làm điều này trong một cuộc gọi chức năng bơm:

này sẽ ném các lỗi:

beforeEach(inject(function(someOtherService) { 
     module('theApp', function($provide) { 
      myMock = {foo: 'bar'}; 
      $provide.value('myService', myServiceMock); 
      someOtherService.doSomething(); 
     }); 
    })); 

này sẽ không:

beforeEach(function() { 
     module('theApp', function($provide) { 
      myMock = {foo: 'bar'}; 
      $provide.value('myService', myServiceMock); 
     }); 

     inject(function(someOtherService) { 
      someOtherService.doSomething(); 
     }); 
    }); 
+0

imho – davidjnelson

+7

Nesting 'module () 'inside' inject() 'không phải là nguyên nhân gây ra lỗi. Thực tế, tất cả các lệnh 'module()' phải là _before_ 'inject()'. –

+0

@HermanKan tại sao? – tobi

4

Trong trường hợp của tôi không hoạt động:

beforeEach(module('user')); 
beforeEach(inject(function ($http) { 
})); 

beforeEach(module('community')); 
beforeEach(inject(function ($controller, $rootScope) { 
})); 

Tôi đã thay đổi điều này để làm cho nó làm việc:

beforeEach(module('user')); 
beforeEach(module('community')); 

beforeEach(inject(function ($http) { 
})); 
beforeEach(inject(function ($controller, $rootScope) { 
})); 
+0

điều này giải thích rằng tiêm nên được gọi là SAU tất cả các khởi tạo mô-đun –

0

Nếu nhà cung cấp của bạn không sử dụng toàn cầu init bạn có thể sử dụng các nhà cung cấp tiêm gốc và chế nhạo nó. trong ví dụ bên dưới testerProvider là bộ điều khiển của bạn.

var injectedProviderMock; 

beforeEach(function() { 
    module('myModule'); 
}); 

beforeEach(inject(function (_injected_) { 
    injectedProviderMock = mock(_injected_); 
})); 


var testedProvider; 
beforeEach(inject(function (_testedProvider_) { 
    testedProvider = _testedProvider_; 
})); 

it("return value from injected provider", function() { 
    injectedProviderMock.myFunc.andReturn('testvalue'); 
    var res = testedProvider.executeMyFuncFromInjected(); 
    expect(res).toBe('testvalue'); 
}); 

//mock all provider's methods 
function mock(angularProviderToMock) { 

    for (var i = 0; i < Object.getOwnPropertyNames(angularProviderToMock).length; i++) { 
     spyOn(angularProviderToMock,Object.getOwnPropertyNames(angularProviderToMock)[i]); 
    } 
    return angularProviderToMock; 
} 
Các vấn đề liên quan