Ich habe myServicediese Verwendungen myOtherService, die einen Fernanruf tätigen und ein Versprechen zurückgeben:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
Um einen Unit-Test für zu machen, muss myServiceich mich verspotten myOtherService, so dass seine makeRemoteCallReturningPromiseMethode ein Versprechen zurückgibt. So mache ich es:
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');
});
}));
Wie Sie oben sehen können, hängt die Definition meines Mocks davon ab $q, mit welcher ich laden muss inject(). Darüber hinaus sollte das Injizieren des Mocks stattfinden module(), was vorher kommen sollte inject(). Der Wert für das Modell wird jedoch nicht aktualisiert, sobald ich es ändere.
Was ist der richtige Weg, um dies zu tun?
myService.makeRemoteCall()? Wenn ja, liegt das Problem darin,myServicedass SiemakeRemoteCallnichts haben und nichts mit Ihrem Verspotteten zu tun habenmyOtherService.