나는 myService
을 사용 myOtherService
하여 원격 호출을하고 약속을 반환합니다.
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
에 대한 단위 테스트를 만들려면 myService
내가 조롱 할 필요 myOtherService
는되도록, makeRemoteCallReturningPromise
방법은 약속을 반환합니다. 이것이 내가하는 방법입니다.
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');
});
}));
위에서 볼 수 있듯이 내 모의 정의는에 따라 $q
로드 해야하는 에 따라 다릅니다 inject()
. 또한 mock 주입은에서 module()
진행되어야합니다 inject()
. 그러나 일단 변경하면 모의 값이 업데이트되지 않습니다.
이를 수행하는 올바른 방법은 무엇입니까?
myService.makeRemoteCall()
있습니까? 그렇다면, 문제는 함께myService
있지 않는makeRemoteCall
당신의 조롱 함께 할 수있는, 아니 아무것도myOtherService
.