2017-02-21 16 views
9

में देखने योग्य सेवा पर मेरे पास एक सेवा (चाइल्ड सर्विस) है जो किसी अन्य सेवा (इंटरैक्टविथसेवर सेवा) पर निर्भर करती है। बाद में सेवा (InteractWithServerService) का उपयोग सर्वर कॉल करने और "किसी भी प्रकार" के देखने योग्य को वापस करने के लिए किया जाता है। सादगी के लिए, मान लें कि यह देखने योग्य लौटाता है। मैं चाइल्ड सर्विस के लिए यूनिट टेस्ट लिखने की कोशिश कर रहा हूं। जब मैं निर्भर सेवा नकलीयूनिट परीक्षण जासूस कोणीय 2

ChildService

@Injectable() 
export class ApplicationService { 
    constructor(private interactWithServerService:InteractWithServerService){;} 

    public GetMeData():string { 
     var output:string;  
     this.interactWithServerService.get("api/getSomeData"). 
      subscribe(response =>{console.log("server response:", response); 
      output=response});   
     return output; 
    } 
} 

ServerInteractionService

@Injectable() 
export class InteractWithServerService {   
    constructor(private http: Http) { 
     ; 
    }  
    get(url: string): Observable<any> {   
     return this.http.get(this.url); 
    }  
} 

परीक्षण का मामला ठीक काम करता है। जैसे कि,

class MockInteractWithServerService { 
    get() { 
     return Observable.of("some text"); 
    }   
} 

describe('Service:ChildService',() => { 
    let childService: ChildService; 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
      { provide: InteractWithServerService, useClass: MockInteractWithServerService }, 
       ChildService], 
     }); 


    beforeEach(inject([ChildService], (actualService: ChildService) => { 
     childService= actualService;   
    })); 

    fit('should call server-call testCall()',() => { 
     let actualReturnvalue= childService.GetMeData();   
     expect(actualReturnvalue).toBe("some text"); 
    }); 
}); 

उपरोक्त विधि प्राथमिकता नहीं दी जाती, जैसा कि मैंने "n" "n" निर्भरता के लिए नकली कक्षाएं लिख दें। तो मैं spyOn का उपयोग कर अपने यूनिट परीक्षण बनाना चाहता हूं। हालांकि, परीक्षण केस काम नहीं करता है और फेंकता है "त्रुटि: एचटीपी के लिए कोई प्रदाता नहीं!"। जबकि मैं समझता हूं कि त्रुटि क्या है, मैं जानना चाहता हूं कि इसे क्यों फेंक दिया गया है हालांकि मैं आश्रित सेवा पर जासूसी कर रहा हूं। ऐसा लगता है कि "spyOn" काम नहीं कर रहा है।

describe('Service:ChildService',() => { 
    let childService: ChildService; 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
      InteractWithServerService, 
       ChildService], 
     }); 

     spyOn(InteractWithServerService.prototype, 'get').and 
      .callFake(()=>  
      {return Observable.of("some text");});  
    }); 
    beforeEach(inject([ChildService], (actualService: ChildService) => { 
     childService= actualService;   
    })); 

    fit('should call server-call testCall()',() => { 
     let actualReturnvalue= childService.GetMeData();   
     expect(actualReturnvalue).toBe("some text"); 
    }); 
}); 

क्या मुझे कुछ स्पष्ट याद आ रही है?

उत्तर

8

However, the test case doesn't work and throws "Error: No provider for Http!".

क्योंकि आप अभी भी providers में सेवा है, इसलिए कोणीय यह अभी भी बनाने के लिए

providers: [ 
InteractWithServerService, 
    ChildService], 

आप के बजाय बनाने एक नकली वर्ग है की क्या कर सकते हैं करने के लिए की तरह कुछ करने के प्रयास कर रहा है

providers: [ 
    { 
    provide: InteractWithServerService, 
    useValue: { get: Observable.of(..) } 
    } 
] 

यहाँ आप useValue जो किसी भी वस्तु प्रदान का उपयोग कर रहे है। इंजेक्शन के दौरान इस्तेमाल किया जाने वाला मूल्य होगा। उपर्युक्त मामले में, यह आपके नकली विधि के साथ कुछ मनमानी वस्तु है।

तुम इतनी जासूसी करने के लिए है कि आप विभिन्न मूल्यों प्रदान कर सकते हैं चाहते हैं, आप InteractWithServerService इंजेक्षन सकता है, और फिर

spyOn(service, 'get').and.returnValue(Observable.of(...)) 
// do test 

एक और बात तुम कर सकते हो कर नकली एक डमी वस्तु

{ provide: Http, useValue: {} } 
साथ Http है

अब InteractWithServerService काम करेगा (केवल वर्तमान में आपके जैसे प्रदाताओं को कक्षा जोड़ना)। और आप बस

let service = TestBed.get(InteractWithServerService); 
spyOn(service, 'get').and.returnValue(..) 
// do test 
+0

धन्यवाद @peeskillet पर जासूसी कर सकते हैं। एक जादू की तरह काम करता है। केवल एक चीज जो चिंताओं को "उपयोग वैल्यू" है और प्रत्येक विधि के लिए मनमाने ढंग से ऑब्जेक्ट लौटा रही है जिसे आप कॉल करेंगे। यह निश्चित रूप से गंदे दिखता है (बल्कि इतना साफ नहीं)। क्या इस तरह कोणीय हमें परीक्षण लिखना चाहता है? –

+0

एक "मनमानी वस्तु" वास्तव में नकली वर्ग का उपयोग करने से अलग नहीं है। केवल अंतर यह है कि एक वर्ग में एक encapsulated है। अंत में वे दोनों मनमानी वस्तुएं हैं। आपकी कक्षा वास्तविक सेवा इंटरफ़ेस का विस्तार नहीं करती है। क्या मनमाना नहीं करता है? यह सब मायने रखता है कि ऑब्जेक्ट में वह तरीका है जिसे कॉल किया जाएगा। –

+0

कोई रास्ता नहीं है कि मैं बहस कर रहा हूं कि नकली कक्षाएं उपयोग से बेहतर हैं Value।मेरा मुद्दा दोनों है - नकली कक्षा और उपयोग वैल्यू समाधान साफ ​​दिखता नहीं है जब पुराने तरीके की तुलना में निर्भर वर्गों को इंजेक्ट करना और उन पर जासूसी करना। –

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