ฉันมี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()
อะไร นอกจากนี้การฉีดจำลองที่ควรจะเกิดขึ้นในซึ่งควรจะมาก่อนmodule()
inject()
อย่างไรก็ตามค่าของการเยาะเย้ยนั้นไม่ได้รับการอัพเดตเมื่อฉันเปลี่ยนมัน
วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?
myService.makeRemoteCall()
หรือ ถ้าเป็นเช่นนั้นปัญหาอยู่ที่myService
ไม่ได้มีไม่ได้ทำอะไรกับเย้ยหยันของคุณmakeRemoteCall
myOtherService