2016-10-28 11 views
12

मैंने अन्य यूनिट परीक्षणों में <router-outlet> संदेशों को खोने में भाग लिया है, लेकिन सिर्फ एक अच्छा अलग उदाहरण है, मैंने एक ऑथगार्ड बनाया है जो जांचता है कि कोई उपयोगकर्ता कुछ कार्यों के लिए लॉग इन है या नहीं।Angular2 के राउटर का परीक्षण कैसे करें।

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    if (!this.authService.isLoggedIn()) { 
     this.router.navigate(['/login']); 
     return false; 
    } 
    return true; 
} 

अब मैं इस के लिए एक इकाई परीक्षण लिखना चाहते हैं:

इस कोड है।

beforeEach(() => { 
    TestBed.configureTestingModule({ 
     imports: [ 
      RouterTestingModule.withRoutes([ 
       { 
        path: 'login', 
        component: DummyComponent 
       } 
      ]) 
     ], 
     declarations: [ 
      DummyComponent 
     ], 
     providers: [ 
      AuthGuardService, 
      { 
       provide: AuthService, 
       useClass: MockAuthService 
      } 
     ] 
    }); 
}); 

मैं एक DummyComponent कि कुछ नहीं करता है बनाया:

यह कैसे मैं अपने परीक्षण शुरू है। अब मेरा परीक्षण। मान लें कि सेवा झूठी वापस आती है और यह this.router.navigate(['/login']) से चलाता है कि:

it('should not let users pass when not logged in',(): void => { 
    expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false); 
}); 

इस के साथ "लोड करने के लिए प्राथमिक आउटलेट नहीं खोजा जा सका" एक अपवाद फेंक देते हैं। स्पष्ट रूप से मैं के बजाय toThrow() का उपयोग कर सकता हूं, लेकिन यह एक बहुत ही समझदार समाधान की तरह प्रतीत नहीं होता है। चूंकि मैं यहां एक सेवा का परीक्षण कर रहा हूं, वहां कोई टेम्पलेट नहीं है जहां मैं <router-outlet> टैग डाल सकता हूं। मैं राउटर का नकल कर सकता हूं और अपना खुद का नेविगेट फ़ंक्शन कर सकता हूं, लेकिन फिर राउटरटेस्टिंग मॉड्यूल का क्या मतलब है? शायद आप उस नेविगेशन को भी देखना चाहते हैं।

+0

हाय क्या आप लॉगिन गार्ड की अपनी spec फ़ाइल प्रदान कर सकते हैं। इसके लिए टेस्ट केस लिखना शुरू करना मेरे लिए सहायक होगा। –

+0

इसके लायक होने के लिए, मैं आपकी निराशा साझा करता हूं। 'राउटरटेस्टिंग मॉड्यूल' का एक भी उदाहरण नहीं मिल रहा है जो वास्तव में काम करता है ... –

उत्तर

25

मैं राउटर का नकल कर सकता हूं और अपना स्वयं का नेविगेट फ़ंक्शन कर सकता हूं, लेकिन फिर राउटरटेस्टिंग मॉड्यूल का क्या मतलब है? शायद आप उस नेविगेशन को भी देखना चाहते हैं।

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

let router = { 
    navigate: jasmine.createSpy('navigate') 
} 

{ provide: Router, useValue: router } 

expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false); 
expect(router.navigate).toHaveBeenCalledWith(['/login']); 

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

+0

यह समझ में आता है। मैं वास्तव में समझ में नहीं आता कि क्यों 'राउटरटेस्टिंग मॉड्यूल' इनपुट के रूप में मार्ग लेता है। मुझे लगता है कि e2e परीक्षणों के लिए काम कर सकते हैं। धन्यवाद! – Bart

+4

आप किसी भी मार्ग को कॉन्फ़िगर करने के लिए _have_ नहीं करते हैं। यदि आप बस इसे राउटरलिंक जैसे निर्देशों के लिए संकलित करना चाहते हैं, तो आप इसे रूट के साथ _without_ कॉलिंग आयात कर सकते हैं। हालांकि काम करने के किसी भी लिंक के लिए, आपको कुछ मार्गों को कॉन्फ़िगर करने की आवश्यकता है। आपके मामले में जो आप खो रहे हैं वह '<राउटर-आउटलेट>' वाला घटक है। यदि आउटलेट के साथ कम से कम एक घटक नहीं है, तो रूटिंग कार्य नहीं कर सकती है –

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