saya sudah myService kegunaan itu myOtherService, yang membuat panggilan jarak jauh, mengembalikan janji:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
Untuk membuat unit test myService saya perlu mengejek myOtherService, sehingga makeRemoteCallReturningPromisemetodenya memberikan janji. Beginilah cara saya melakukannya:
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');
});
}));
Seperti yang dapat Anda lihat di atas, definisi mock saya tergantung pada $q , yang harus saya muat menggunakan inject(). Selanjutnya, menyuntikkan mock harus terjadi module(), yang harusnya terjadi sebelumnya inject(). Namun, nilai untuk mock tidak diperbarui setelah saya mengubahnya.
Apa cara yang tepat untuk melakukan ini?
myService.makeRemoteCall()? Jika demikian, masalahnya adalahmyServicetidak memilikimakeRemoteCall, tidak ada hubungannya dengan ejekan AndamyOtherService.