2015-11-01 7 views
5

एंगुलरजे में एक साधारण फैक्टरी कैसे नकल करते हैं जो Karma यूनिट परीक्षण में स्थिर डेटा देता है?एंगुलरजेस परीक्षण सरल फैक्ट्री जो स्थिर डेटा लौटाता है

मैं इस सरल कारखाना है, कि उदाहरण के लिए स्थिर डेटा वापस:

angular.module('conciergeApp.services') 
     .factory('CurrentUser', function() { 
     return { 
      id: 1, 
      hotel_id: 1, 
     } 
     }); 

मुझे पता है कि यह कैसे के लिए एक Karma परीक्षण लिखने के लिए करना चाहते हैं?

अब तक, मैं इस कोड है, लेकिन आईडी काम नहीं करता:

Firefox 41.0.0 (Mac OS X 10.10.0) ReplyCtrl should return value from mock dependency FAILED 
    Error: [$injector:unpr] Unknown provider: mockUtilSvcProvider <- mockUtilSvc 

उत्तर

4

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. 
+1

ऐतिहासिक पहले 'inject' गलत जगह में भी है।उसे इसे 'पहले' – Phil

+0

@ फिल सच में होना चाहिए, मैंने इसे चरण 4 में उल्लेख किया है, शायद यह स्पष्ट नहीं है। मुझे इसे अपडेट करने दें। धन्यवाद। – PSL

+0

@PSL महान उत्तर, और पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। यह इस बात पर और अधिक साफ करता है कि यहां क्या हो रहा है, और इस नकली सेवा परीक्षण को कैसे सेट अप किया जाए इसके पीछे तर्क। धन्यवाद! –

संबंधित मुद्दे