Nasıl alay Angularjs söz veren bir servis Yasemin birim test edebilirim?
Uzak bir çağrı yapar myOtherService, kullanan başlatılıyor, sözünü geri verecekti:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
Bir birim myService ben test yapmak için myOtherService, makeRemoteCallReturningPromise() yöntemi bir söz verir gibi alay gerekiyor. Ben böyle severim
describe('Testing remote call returning promise', function() {
var myService;
var myOtherServiceMock = {};
beforeEach(module('app.myService'));
// I have to inject mock when calling module(),
// and module() should come before any inject()
beforeEach(module(function ($provide) {
$provide.value('myOtherService', myOtherServiceMock);
}));
// However, in order to properly construct my mock
// I need $q, which can give me a promise
beforeEach(inject( function(_myService_, $q){
myService = _myService_;
myOtherServiceMock = {
makeRemoteCallReturningPromise: function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
}
};
}
// Here the value of myOtherServiceMock is not
// updated, and it is still {}
it('can do remote call', inject(function() {
myService.makeRemoteCall() // Error: makeRemoteCall() is not defined on {}
.then(function() {
console.log('Success');
});
}));
Yukarıda da görebileceğiniz gibi, benim alay tanımı yüklenemedi: var $q inject() kullanarak bağlıdır. Ayrıca, sahte enjekte önce geliyor olmalı module() Bir şeyler olabilir.
inject(). Ancak, sahte değeri değiştirdim bir kez güncellenir.
Bunu yapmak için doğru yolu nedir?
CEVAP
Senin yaptığın gibi çalışmıyor neden emin değilim, ama genellikle spyOn fonksiyonu ile bunu. Şöyle bir şey:
describe('Testing remote call returning promise', function() {
var myService;
beforeEach(module('app.myService'));
beforeEach(inject( function(_myService_, myOtherService, $q){
myService = _myService_;
spyOn(myOtherService, "makeRemoteCallReturningPromise").and.callFake(function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
});
}
it('can do remote call', inject(function() {
myService.makeRemoteCall()
.then(function() {
console.log('Success');
});
}));
Ayrıca çağrılacak then işlevi $digest bir çağrı yapmak gerektiğini unutmayın. BakınTest$q documentation bölüm.
------EDİT------
Daha yakın ne yaptığını baktıktan sonra kodunuzda sorun görüyorum. beforeEach yepyeni bir nesneye myOtherServiceMock oluyorsun. $provide hiç bu başvuru göreceksiniz. Sen sadece var olan referans güncellemeniz gerekir:
beforeEach(inject( function(_myService_, $q){
myService = _myService_;
myOtherServiceMock.makeRemoteCallReturningPromise = function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
};
}

Nasıl Yasemin ile AngularJS bir hizmet...
Nasıl konsoldan bir AngularJS bir hizm...
Nasıl bir birim GUİ test edebilirim?...
Nasıl birim Arduino kodu test edebilir...
Nasıl C dosya sistemi dışarı alay mı# ...