मैं routerLink और routerLinkActive के साथ एक (कोणीय 2) घटक का परीक्षण करने की कोशिश कर रहा हूं, लेकिन सभी परीक्षण मामले निम्नलिखित त्रुटि संदेश के साथ विफल हो जाते हैं। (नोट: मैंने राउटर और अन्य संबंधित निर्भरताओं को दबा दिया है। यहां संदर्भ जिसका मैंने उसी के लिए उपयोग किया था।)

अपरिभाषित की संपत्ति 'सदस्यता' नहीं पढ़ सकता

मैंने यह भी देखा है कि जब routerLink और routerLinkActive को मेरे टेम्प्लेट से हटा दिया जाएगा, तो सभी परीक्षण मामले बिना किसी त्रुटि के चलेंगे।

मुझे लगता है कि त्रुटि RouterTestingModule या SharedModule (पासवर्ड इनपुट फ़ील्ड को प्रदर्शित करने और मान्य करने के लिए घटक शामिल है) के कारण हुई है। इसलिए मैंने उन्हें हटाने या जोड़ने की कोशिश की, जो वास्तव में समस्या पैदा कर रहा है। यहाँ मैंने क्या देखा।

  • मुझे 'Cannot read property 'subscribe' of undefined' मिलता है अगर RouterTestingModule या SharedModule मौजूद है।
  • अगर मैं RouterTestingModule और SharedModules दोनों को हटा देता हूं तो मुझे राउटर से जुड़ी कोई त्रुटि नहीं मिलती है, लेकिन SharedModules के तत्व घटक में लोड नहीं होंगे और कुछ परीक्षण मामले अभी भी विफल हो जाते हैं क्योंकि वह।

टेस्टबेड कॉन्फ़िगरेशन:

TestBed.configureTestingModule({

            imports: [CoreModule,SharedModule,RouterTestingModule],
            declarations: [ MyComponent,RouterLinkStubDirective,RouterOutletStubComponent ],
            providers: [
                FormBuilder,
                { provide: Router, useClass: RouterStub },
                { provide: ActivatedRoute, userClass: ActivatedRouteStub}
            ],
            schemas: [NO_ERRORS_SCHEMA]
        })
            .overrideComponent(MyComponent, {
                set: {
                    providers: [
                        {provide: AuthModel, useClass: MockAuthModel}    
                    ],
                }
            })
            .compileComponents();
    }));

सक्रिय राउटरस्टब:

@Injectable()
export class ActivatedRouteStub {

    // ActivatedRoute.params is Observable
    private subject = new BehaviorSubject(this.testParams);
    params = this.subject.asObservable();

    // Test parameters
    private _testParams: {};
    get testParams() { return this._testParams; }
    set testParams(params: {}) {
        this._testParams = params;
        this.subject.next(params);
    }

    // ActivatedRoute.snapshot.params
    get snapshot() {
        return { params: this.testParams };
    }
}

समस्या को हल करने के लिए मुझे क्या बदलाव करने चाहिए?

6
Sanju 20 सितंबर 2017, 13:19

2 जवाब

सबसे बढ़िया उत्तर

मैं इस मुद्दे को हल करने में कामयाब रहा हूं। मैं सूची दूंगा कि मैंने इस मुद्दे को हल करने के लिए क्या बदलाव किए हैं।

  1. जैसा कि मैंने टिप्पणियों में उल्लेख किया है, routerLink केवल वास्तविक राउटर पर काम करता है। इसलिए हमें RouterTestingModule (यदि आप परीक्षण के दौरान उस पर क्लिक करने की योजना बना रहे हैं, तो .withRoutes([{path: 'some/path',component: someComponent}]) शामिल करें) शामिल करने की आवश्यकता है।

  2. यदि हमने पहले ही RouterTestingModule जोड़ लिया है, तो हमें अलग से राउटर निर्भरता प्रदान करने की आवश्यकता नहीं है। इसलिए मैंने Router और ActivatedRoute निर्भरता जो मैंने प्रदान की थी, दोनों को हटा दिया। अब, त्रुटि Cannot read property 'subscribe' of undefined से Cannot read property 'outlets' of null में बदल गई है।

  3. मैंने पाया यह त्रुटि तब होती है जब routerLink शून्य की ओर इशारा कर रहा हो चर . मेरे मामले में, favoriteUrl नाम की संपत्ति जिसे मैंने routerLink को सौंपा था, अलग परीक्षण वातावरण के कारण शून्य थी। इसलिए मैंने मैन्युअल रूप से beforeEach फ़ंक्शन में संपत्ति के लिए एक मान निर्दिष्ट किया और इससे समस्या हल हो गई, कम से कम मेरे लिए।

मदद करने की कोशिश करने वाले सभी को धन्यवाद! :-)

सन्दर्भ:

https://stackoverflow.com/a/45916133/8558515

https://stackoverflow.com/a/42039920/8558515

4
Community 20 जून 2020, 12:12

कोणीय के पास यह जानने का कोई तरीका नहीं है कि आप इसे सक्रिय रूट चर का उपयोग करना चाहते हैं जिसे आपने स्वयं बनाया है (टिप्पणी के अनुसार) इसलिए यह डिफ़ॉल्ट बना देगा और डीआई में इसका उपयोग करेगा। ActivatedRoute निर्भरता के लिए वर्तमान सेटअप के बजाय { provide: ActivatedRoute, useValue: mockInstance} का उपयोग करें जहां mockInstance ActivatedRoute का नकली है, आप इसे jasmine.createSpyObj के साथ बना सकते हैं

0
KlsLondon 20 सितंबर 2017, 17:02