2016-09-30 18 views
14

कोणीय 2.0.0 में, मैं यूनिट परीक्षण करता हूं जो राउटर का उपयोग करता है। हालांकि मुझे लगता है कि 'सप्लाइड पैरामीटर कॉल लक्ष्य के किसी भी हस्ताक्षर से मेल नहीं खाते हैं।' त्रुटि। Spects में विजुअल स्टूडियो कोड में यह नया राउटर() है जो लालकोणीय 2 - राउटर के साथ यूनिट परीक्षण

पर हाइलाइट किया गया है, तो मैं वास्तव में सराहना करता हूं कि कोई मुझे सही सिंटैक्स क्या बता सकता है? अग्रिम में धन्यवाद। मेरे कोड इस प्रकार है:

spec.ts

import { TestBed, async } from '@angular/core/testing'; 
import { NavToolComponent } from './nav-tool.component'; 
import { ComponentComm } from '../../shared/component-comm.service'; 
import { Router } from '@angular/router'; 

describe('Component: NavTool',() => { 
    it('should create an instance',() => { 
    let component = new NavToolComponent(new ComponentComm(), new Router()); 
    expect(component).toBeTruthy(); 
    }); 
}); 

घटक निर्माता

constructor(private componentComm: ComponentComm, private router: Router) {} 

उत्तर

8

क्योंकि Route कुछ निर्भरता वह अपने निर्माता को पारित कर दिया उम्मीद है यह।

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

आरंभ करने के लिए, आप

import { TestBed } from '@angular/core/testing'; 

describe('Component: NavTool',() => { 
    let mockRouter = { 
    navigate: jasmine.createSpy('navigate') 
    }; 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     declarations: [ NavToolComponent ], 
     providers: [ 
     { provide: Router, useValue: mockRouter }, 
     ComponentComm 
     ] 
    }); 
    }); 
    it('should click link',() => { 
    let fixture = TestBed.createComponent(NavToolComponent); 
    fixture.detectChanges(); 
    let component: NavToolComponent = fixture.componentInstance; 
    component.clickLink('home'); 
    expect(mockRouter.navigate).toHaveBeenCallWith(['/home']); 
    }); 
}); 

या ऐसा ही कुछ की तरह कुछ होना चाहिए। परीक्षण के लिए स्क्रैच से मॉड्यूल को कॉन्फ़िगर करने के लिए आप TestBed का उपयोग करते हैं। आप @NgModule के साथ इसे बहुत अधिक तरीके से कॉन्फ़िगर करते हैं।

यहां हम सिर्फ राउटर का मज़ाक उड़ा रहे हैं। चूंकि हम केवल यूनिट परीक्षण कर रहे हैं, इसलिए हम वास्तविक रूटिंग सुविधा नहीं चाहते हैं। हम सिर्फ यह सुनिश्चित करना चाहते हैं कि इसे सही तर्क के साथ बुलाया जाए। नकली और spy हमारे लिए उस कॉल को कैप्चर करने में सक्षम होंगे।

यदि आप असली राउटर का उपयोग करना चाहते हैं, तो आपको RouterTestingModule का उपयोग करने की आवश्यकता है, जहां आप मार्गों को कॉन्फ़िगर कर सकते हैं।

  • कोणीय परीक्षण बुनियादी सुविधाओं का उपयोग कर अधिक उदाहरण के लिए Angular docs on Testing: एक उदाहरण here और here

    भी देखें देखें।

34

आप, साथ ही RouterTestingModule और बस spyOn इस तरह नेविगेट फ़ंक्शन का उपयोग कर सकते हैं ...

import { TestBed } from '@angular/core/testing'; 
import { RouterTestingModule } from '@angular/router/testing'; 

import { MyModule } from './my-module'; 
import { MyComponent } from './my-component'; 

describe('something',() => { 

    let fixture: ComponentFixture<LandingComponent>; 

    beforeEach(() => { 

     TestBed.configureTestingModule({ 
      imports: [ 
       MyModule, 
       RouterTestingModule.withRoutes([]), 
      ], 
     }).compileComponents(); 

     fixture = TestBed.createComponent(MyComponent); 

    }); 

    it('should navigate',() => { 
     let component = fixture.componentInstance; 
     let navigateSpy = spyOn((<any>component).router, 'navigate'); 

     component.goSomewhere(); 
     expect(navigateSpy).toHaveBeenCalledWith(['/expectedUrl']); 
    }); 
}); 
+3

धन्यवाद, यह काम करता है! मैं भी 'राउटर = टेस्टबैड.जेट (राउटर)' का उपयोग करता हूं और किसी भी घटक को कास्टिंग करने के बजाय, मेरे राउटर को एक चर के साथ एक चर में सहेजता हूं, जैसा कि https://angular.io/guide/testing#testbedget –

+0

में अनुशंसित है आप - यह वर्णित के रूप में काम करता है :) – ICantSeeSharp

+0

धन्यवाद, यह मेरी समस्या हल करता है: राउटर का मज़ाक उड़ाते समय अपरिभाषित की संपत्ति 'रूट' नहीं पढ़ सकता। –

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