Ben uzak bir çağrı yapar, sözlerini iade, myServicebu kullanımları var myOtherService:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
Bir birim testi yapmak için , yöntemi bir söz döndürür şekilde , myServicealay gerekir . Bunu nasıl yaparım:myOtherServicemakeRemoteCallReturningPromise
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ıdan da görebileceğiniz gibi, benim alayımın tanımı, $qkullanmak zorunda olduğum yüke bağlı inject(). Dahası, daha module()önce gelmesi gereken sahte enjekte edilmesi gerekir inject(). Ancak, değiştirdikten sonra sahte değeri güncellenmez.
Bunu yapmanın uygun yolu nedir?
myService.makeRemoteCall()mı? Eğer öyleyse, sorun sahipmyServiceolmamanızmakeRemoteCall, alayınızla ilgisi yokturmyOtherService.