2015-04-18 6 views
6

मैं कोणीय मॉड्यूल है:जैस्मीन/कोणीय जेएस: इकाई परीक्षण में सेवा के लिए निर्भर सेवा इंजेक्ट करें?

var app = angular.module("SearchUI",[]); 
उस में

, मैं एक सेवा "configService", कि config पैरामीटर का गुच्छा का कहना है:

app.provider("configService",function(){ 
    //stuff here 
}) 

मैं configService fineL

में चमेली इकाई परीक्षण भाग गया है
describe('configService',function(){ 

var configService,$httpBackend; 


    beforeEach(module('SearchUI')); 
    beforeEach(inject(function(_configService_,$injector){ 
     configService = _configService_;  
     $httpBackend = $injector.get("$httpBackend"); 

    })); 

    it('should have default values for configService', function(){ 
     expect(configService.getDefaultSearch()).toEqual(['abstract','title','keyword','keywordplus' 
    ]); 
    }); 

//other stuff 

सभी परीक्षण ठीक हो जाते हैं।

हालांकि, मैं समझ नहीं कर रहा हूँ कैसे अन्य सेवा के लिए है कि इंजेक्शन बनाए रखने के लिए:

अपने आवेदन में

अर्थात्:

app.service("SearchService",function($http,$log,configService,$q){ 
    //stuff 
    search_params = configService.getDefaultSearch(); 

}) 

मेरी कल्पना:

describe('SearchService',function(){ 
    var searchService,configService; 

    beforeEach(module('SearchUI')); 
    beforeEach(inject(function(_configService_,_SearchService_){ 
     configService = _configService_;  
     searchService = _SearchService_; 

    })); 


    it('SearchService should return results', function(){ 
     var waiting = searchService.SimpleSearch("card","wos",0); 


//other stuff 

कल्पना में कारण विफल रहता है simplesearch फ़ंक्शन के लिए यह आवश्यक है:

search_params = configService.getDefaultSearch(); //get the default search parameters  

मेरा सवाल है, मैं किसी अन्य सेवा में आवश्यक सेवा कैसे इंजेक्ट कर सकता हूं?

+0

क्या आप वाकई इस बात का असफल हो रहे हैं? जब तक आपको इसके मानों को बदलने के लिए configService को नकल करने की आवश्यकता नहीं है, तब तक सर्च सर्विस को आपके परीक्षणों में configService को छूए बिना इंजेक्शन दिया जाना चाहिए। – lecstor

+0

हां, यह एक त्रुटि के साथ विफल रहता है जो इंगित करता है कि configservice शुरू नहीं हुआ था – nate

+0

आपको प्राप्त होने वाली सटीक त्रुटि पोस्ट करें। –

उत्तर

3

सेवाएं केवल जावास्क्रिप्ट कक्षाएं हैं और आप अपने निर्भरता इंजेक्शन को सुविधाजनक बनाने के लिए कोणीय इंजेक्ट तंत्र का उपयोग किए बिना उनमें से एक उदाहरण बना सकते हैं। इसके बजाय आप आवश्यक पैरामीटर की आपूर्ति करते समय स्वयं कक्षा का एक नया उदाहरण बना सकते हैं। एक छोटे से समायोजन जो कोणीय मॉड्यूल में अपने इंजेक्शन से सेवा की घोषणा बाहर अलग कर देगा बनाकर

app.service("SearchService",function($http,$log,configService,$q){...

इसके बजाय इस बात का

:

वर्तमान में आप एक इनलाइन समारोह के माध्यम से आपकी सेवा बना रहे हैं। ऐसा करने से आप अपने परीक्षण से सेवा कक्षा तक पहुंच प्राप्त कर सकते हैं।

function SearchService($http, configService){... 

app.service("SearchService", SearchService); 

अपने परीक्षण से आप सुइट अपने beforeEach पूर्वप्रक्रमक में अपने इंजेक्शन तैयार कर सकते हैं:

describe('configService',function(){ 

    var configService, httpBackend; 
    beforeEach(module('SearchUI')); 
    beforeEach(inject(function($httpBackend){ 
     httpBackend = "$httpBackend"; 
     configService = jasmine.createSpyObj('configService', ['getDefaultSearch']); 
    })); 

    /* helper method that I create to only have one place where the service is created 
    If I add a new param/dependency then I only have to change the construction once */ 
    function createService(){ 
     return new SearchService(httpBackend, configService); 
    } 
}); 

(परीक्षण के लिए इस दृष्टिकोण लेने निर्भरता इंजेक्शन को नियंत्रित करने के लिए मैन्युअल बजाय कोणीय के कार्यान्वयन पर निर्भर के लिए मुख्य कारण) पूर्ण नियंत्रण रखना है और उस आइटम को वास्तव में अलग करना है जिसे मैं परीक्षण करने की कोशिश कर रहा हूं।

1

configService और SearchService मॉड्यूल ऐप में init हैं लेकिन मॉड्यूल SearchUI में नहीं हैं। बदलें "पहले से (मॉड्यूल ('खोजयूआई'));" "पहले से (मॉड्यूल ('myapp'));"

+0

मेरी गलती है, वे असली कोड में एक ही मॉड्यूल में हैं। – nate

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