2017-01-02 18 views
5

मैंने अभी तक यूनिट-टेस्टिंग के साथ शुरुआत की है, और मैं अपनी सेवाओं और कुछ कोणीय और आयनिक के साथ नकल करने में सक्षम हूं, लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करता हूं ChangeDetectorRef वही।कोणीय 2: यूनिट परीक्षण

मेरा मतलब है कि यह किस प्रकार की जादुई है?

beforeEach(async(() => 
    TestBed.configureTestingModule({ 
     declarations: [MyComponent], 
     providers: [ 
     Form, DomController, ToastController, AlertController, 
     PopoverController, 

     {provide: Platform, useClass: PlatformMock}, 
     { 
      provide: NavParams, 
      useValue: new NavParams({data: new PageData().Data}) 
     }, 
     {provide: ChangeDetectorRef, useClass: ChangeDetectorRefMock} 

     ], 
     imports: [ 
     FormsModule, 
     ReactiveFormsModule, 
     IonicModule 
     ], 
    }) 
    .overrideComponent(MyComponent, { 
     set: { 
     providers: [ 
      {provide: ChangeDetectorRef, useClass: ChangeDetectorRefMock}, 
     ], 
     viewProviders: [ 
      {provide: ChangeDetectorRef, useClass: ChangeDetectorRefMock}, 
     ] 
     } 
    }) 
    .compileComponents() 
    .then(() => { 
     let fixture = TestBed.createComponent(MyComponent); 
     let cmp = fixture.debugElement.componentInstance; 

     let cdRef = fixture.debugElement.injector.get(ChangeDetectorRef); 

     console.log(cdRef); // logs ChangeDetectorRefMock 
     console.log(cmp.cdRef); // logs ChangeDetectorRef , why ?? 
    }) 
)); 

it('fails no matter what', async(() => { 
    spyOn(cdRef, 'markForCheck'); 
    spyOn(cmp.cdRef, 'markForCheck'); 

    cmp.ngOnInit(); 

    expect(cdRef.markForCheck).toHaveBeenCalled(); // fail, why ?? 
    expect(cmp.cdRef.markForCheck).toHaveBeenCalled(); // success 

    console.log(cdRef); // logs ChangeDetectorRefMock 
    console.log(cmp.cdRef); // logs ChangeDetectorRef , why ?? 
    })); 

@Component({ 
    ... 
}) 
export class MyComponent { 
constructor(private cdRef: ChangeDetectorRef){} 

ngOnInit() { 
    // do something 
    this.cdRef.markForCheck(); 
} 
} 

मैं सब कुछ कोशिश की है, async, fakeAsync, injector([ChangeDetectorRef],() => {})

कुछ भी काम नहीं करता है।

+0

चेंजडिटेक्टर रिफ को कोणीय 2 कंपाइलर द्वारा विशेष उपचार दिया जाता है। मुझे लगता है कि आप इसे प्रदान नहीं कर सकते हैं। आप AsyncPipe https://github.com/angular/angular/blob/8f5dd1f11e6ca1888fdbd3231c06d6df00aba5cc/modules/%40angular/common/test/pipes/async_pipe_spec.ts के लिए परीक्षण की जांच कर सकते हैं। SpyChangeDetectorRef – yurzui

+0

का उपयोग किया जाता है मैं एक ही समस्या को मार रहा हूं - कैसे क्या लोग इस के आसपास काम कर रहे हैं? – SamF

उत्तर

6

मामले में किसी को भी इस में चलाता है, यह एक तरह से है कि अच्छी तरह से मेरे लिए काम किया है:

आप अपने निर्माता में ChangeDetectorRef उदाहरण इंजेक्शन कर रहे हैं के रूप में:

constructor(private cdRef: ChangeDetectorRef) { } 

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

अपनी स्पेक फ़ाइल में, ChangeDetectorRef प्रदान किए बिना अपने टेस्टबैड को कॉल करें क्योंकि यह आपको जो भी प्रदान नहीं करेगा उसे प्रदान नहीं करेगा। घटक है कि एक ही beforeEach ब्लॉक सेट, तो यह चश्मा के रूप में यह डॉक्स here में किया जाता है के बीच रीसेट है: सीधे विशेषता

describe('someMethod()',() => { 
    it('calls detect changes',() => { 
    const spy = spyOn((component as any).cdRef, 'detectChanges'); 
    component.someMethod(); 

    expect(spy).toHaveBeenCalled(); 
    }); 
}); 

पर

component = fixture.componentInstance; 
फिर परीक्षण में

, जासूसी जासूस के साथ आप .and.returnValue() का उपयोग कर सकते हैं और जो कुछ भी आपको चाहिए उसे वापस कर दें।

ध्यान दें कि (component as any)cdRef के रूप में उपयोग किया जाता है एक निजी विशेषता है। लेकिन निजी संकलित जावास्क्रिप्ट में निजी मौजूद नहीं है, इसलिए यह सुलभ है।

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

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