আমার কাছে myServiceসেগুলি ব্যবহার রয়েছে myOtherService, যা প্রত্যন্ত কল করে, প্রতিশ্রুতি ফেরায়:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
আমার জন্য একক পরীক্ষা করার জন্য myServiceআমার উপহাস করা দরকার myOtherService, এর makeRemoteCallReturningPromiseপদ্ধতিটি প্রতিশ্রুতি দেয় returns আমি এটি এইভাবে করি:
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।