1) आप inject
है:
describe('ReplyCtrl', function() {
beforeEach(module('conciergeApp'));
beforeEach(module(function($provide) {
$provide.service('CurrentUser', function() {
return 1;
});
}));
//Getting reference of the mocked service
var mockUtilSvc;
inject(function(CurrentUser) {
mockUtilSvc = CurrentUser;
});
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('ReplyCtrl', {
$scope: scope
});
}));
it('should return value from mock dependency', inject(function(mockUtilSvc) {
expect(mockUtilSvc()).toEqual(1);
}));
});
यह है कि मैं हो रही किया गया है त्रुटि संदेश है गलत जगह में आप अपने परीक्षण it
में इंजेक्शन फ़ंक्शन निर्दिष्ट कर रहे हैं, बस इसे हटा दें।
यानी
it('should return value from mock dependency', inject(function(mockUtilSvc) {
expect(mockUtilSvc()).toEqual(1);
}));
बन जाएगा
it('should return value from mock dependency', function() {
expect(mockUtilSvc()).toEqual(1);
});
2) अब मुद्दा यह है कि mockUtilSvc
, भी अपने नकली आप की जरूरत के आधार पर सेवा उदाहरण और अपने परिभाषा के अनुसार नहीं एक समारोह है है इसे कारखाने के रूप में परिभाषित करें (यानी आप कारखाने के मूल्य के रूप में 1 लौट रहे हैं और यह new
सक्षम नहीं है)।
beforeEach(module(function($provide) {
$provide.factory('CurrentUser', function() {
return 1;
//If you expect factory to be a function then you need to return a function returning 1 here
});
}));
और
expect(mockUtilSvc).toEqual(1);
3) आप के साथ ही इस लिख सकते हैं:
$provide.value('CurrentUser', 1); //Provide the instance here right away
4) आपका पहला inject
गलत जगह में भी है। आप बस इसे चला रहे हैं, लेकिन प्रत्येक स्पेक रन के दौरान इंस्टेंस नहीं चल रहे हैं और आवंटित नहीं कर रहे हैं। before Each
यात्रा आप अपने चर करने के लिए सेवा उदाहरण का मूल्य निर्धारित करने की आवश्यकता अर्थात्:
beforeEach(inject(function(CurrentUser) {
mockUtilSvc = CurrentUser;
}));
एक उदाहरण परीक्षण:
describe('ReplyCtrl', function() {
var mockData = {
id: 1234,
hotel_id: 1,
}, mockUtilSvc, scope, ctrl ;
beforeEach(module('conciergeApp', function($provide) {
$provide.value('CurrentUser', mockData);
}));
beforeEach(inject(function(CurrentUser, $rootScope, $controller) {
mockUtilSvc = CurrentUser;
scope = $rootScope.$new();
ctrl = $controller('ReplyCtrl', {
$scope: scope
});
}));
it('should return value from mock dependency', function() {
expect(mockUtilSvc.id).toEqual(mockData.id);
});
});
Demo
नोट: वहाँ उपहास करने के लिए अन्य तरीके हैं और नकली इंजेक्ट करें। उदाहरण के लिए इस मामले में आपको वास्तव में $provide.value
का उपयोग करने की आवश्यकता नहीं है। इसके बजाय आप अपने नकली वस्तु बना सकते हैं और नियंत्रक इन्स्टेन्शियशन दौरान उस में पारित तुम वहाँ पर पूरा नियंत्रण है के रूप में नीचे की तरह, निर्भरता पारित करने के लिए कर सकते हैं:
ctrl = $controller('ReplyCtrl', {
$scope: scope,
CurrentUser: mockUtilSvc
});
तरीकों आप की तरह नकली बना सकते हैं साथ
अधिक जटिल सेवा के मामले में इस।
mockSvc = jasmin.createSpyObj('MyService', ['method1', 'method2']);
mockSvc.method1.and.returnValue($q.when(mockData)); //Simulating a promise returned from an $http call in the method.
ऐतिहासिक पहले 'inject' गलत जगह में भी है।उसे इसे 'पहले' – Phil
@ फिल सच में होना चाहिए, मैंने इसे चरण 4 में उल्लेख किया है, शायद यह स्पष्ट नहीं है। मुझे इसे अपडेट करने दें। धन्यवाद। – PSL
@PSL महान उत्तर, और पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। यह इस बात पर और अधिक साफ करता है कि यहां क्या हो रहा है, और इस नकली सेवा परीक्षण को कैसे सेट अप किया जाए इसके पीछे तर्क। धन्यवाद! –