I'm pengujian layanan, tetapi layanan Yang tergantung pada layanan B (yaitu layanan B yang disuntikkan ke layanan).
I've seen pertanyaan tapi kasus saya adalah sedikit berbeda karena menurut saya itu lebih masuk akal untuk pura-pura layanan B bukan suntik yang sebenarnya contoh dari layanan B. I'd mengejek dengan jasmine mata-mata.
Berikut ini's contoh soal:
describe("Sample Test Suite", function() {
beforeEach(function() {
module('moduleThatContainsServiceA');
inject([
'serviceA', function(service) {
this.service = service;
}
]);
});
it('can create an instance of the service', function() {
expect(this.service).toBeDefined();
});
});
Kesalahan yang saya dapatkan adalah:
Error: Unknown provider: serviceBProvider
Bagaimana aku bisa melakukan sesuatu seperti ini?
Sebenarnya di AngularJS Dependency Injection menggunakan 'lalu menang' aturan. Sehingga anda dapat menentukan layanan anda dalam tes anda hanya setelah termasuk modul dan dependensi, dan kemudian ketika layanan yang anda're pengujian akan permintaan layanan B menggunakan DI, AngularJS akan memberikan mengejek versi dari layanan B.
Hal ini sering dilakukan dengan mendefinisikan modul baru seperti MyAppMocks, menempatkan mengejek jasa/nilai-nilai yang ada dan kemudian hanya menambahkan modul ini sebagai ketergantungan.
Jenis (skematis):
beforeEach(function() {
angular.module('MyAppMocks',[]).service('B', ...));
angular.module('Test',['MyApp','MyAppMocks']);
...
Saya melakukan ini di CoffeeScript dan menemukan tambahan gotcha. (Juga, saya menemukan kode pada halaman ini akan membingungkan singkat.) Berikut ini's a kerja lengkap contoh:
describe 'serviceA', ->
mockServiceB = {}
beforeEach module 'myApp' # (or just 'myApp.services')
beforeEach ->
angular.mock.module ($provide) ->
$provide.value 'serviceB', mockServiceB
null
serviceA = null
beforeEach inject ($injector) ->
serviceA = $injector.get 'serviceA'
it 'should work', ->
expect( true ).toBe( true )
#serviceA.doStuff()
Tanpa secara eksplisit kembali nol setelah $memberikan.nilai
, aku terus mendapatkan Kesalahan: Argumen 'fn' tidak fungsi, punya Objek
. Saya menemukan jawabannya di Google Grup thread.
Yang Valentyn solusi yang bekerja untuk saya, tapi ada alternatif lain.
beforeEach(function () {
angular.mock.module("moduleThatContainsServiceA", function ($provide) {
$provide.value('B', ...);
});
});
Kemudian ketika AngularJS layanan permintaan Layanan B dengan Dependency Injection, anda mengejek Pelayanan B akan diberikan bukan Layanan B dari moduleThatContainsServiceA.
Dengan cara ini anda don't perlu membuat tambahan modul sudut hanya untuk mengejek Layanan.
Saya menemukan metode yang paling sederhana adalah hanya untuk menyuntikkan layanan B dan pura-pura itu. misalnya Layanan mobil tergantung pada layanan Mesin. Sekarang kita perlu untuk mengejek Mesin saat pengujian Mobil:
describe('Testing a car', function() {
var testEngine;
beforeEach(module('plunker'));
beforeEach(inject(function(engine){
testEngine = engine;
}));
it('should drive slow with a slow engine', inject(function(car) {
spyOn(testEngine, 'speed').andReturn('slow');
expect(car.drive()).toEqual('Driving: slow');
}));
});
Referensi: https://github.com/angular/angular.js/issues/1635
Ini adalah apa yang bekerja untuk saya. Kuncinya adalah mendefinisikan nyata modul untuk dipermainkan. Panggilan sudut.mengejek.modul membuat real modul mockable dan memungkinkan hal-hal yang akan dihubungkan.
beforeEach( ->
@weather_service_url = '/weather_service_url'
@weather_provider_url = '/weather_provider_url'
@weather_provider_image = "test.jpeg"
@http_ret = 'http_works'
module = angular.module('mockModule',[])
module.value('weather_service_url', @weather_service_url)
module.value('weather_provider_url', @weather_provider_url)
module.value('weather_provider_image', @weather_provider_image)
module.service('weather_bug_service', services.WeatherBugService)
angular.mock.module('mockModule')
inject( ($httpBackend,weather_bug_service) =>
@$httpBackend = $httpBackend
@$httpBackend.when('GET', @weather_service_url).respond(@http_ret)
@subject = weather_bug_service
)
)