2016-12-26 64 views
3

我在測試我的某個組件時遇到了一些麻煩。測試情況如下:Angular2/Jasmine期望爲null使瀏覽器崩潰

describe('SmpEventsNewCompactEventComponent',() => { 

    const specService: SmpSpecService = new SmpSpecService(); 

    describe('Component rendering',() => { 
    let componentInstance: any; 
    let componentFixture: ComponentFixture<any>; 
    let cssSelector: string; 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
     imports: [ 
      MaterialModule.forRoot() 
     ], 
     declarations: [ 
      SmpEventsCompactEventComponent, 
      SmpEventsAddressComponent 
     ], 
     providers: [ 
      { provide: SMP_OT_HELPER, useValue: newOtHelperInstance() }, 
      DatePipe, 
      SmpEventTypeCheckerService, 
      SmpLangService 
     ] 
     }); 

     componentFixture = TestBed.createComponent(SmpEventsCompactEventComponent); 
     componentInstance = componentFixture.componentInstance; 
    }); 

    describe('Global',() => { 
     it('GIVEN there are date/time AND address ' + 
     'WHEN component loads THEN display event',() => { 
      //// TEST ONE 
      componentInstance.isEventEnabled = true; 
      cssSelector = '.events-compact-event'; 

      let debugElement = specService.queryDebugElement(
      componentFixture, cssSelector); 

      expect(debugElement).not.toBeNull(); 
     }); 

     it('GIVEN there are no date/time AND no address ' + 
     'WHEN component loads THEN do not display event',() => { 
      //// TEST TWO 
      componentInstance.isEventEnabled = true; 
      //componentInstance.isAddressEnabled = false; 
      // componentInstance.isDateEnabled = false; 
      cssSelector = '.events-compact-event'; 

      let debugElement = specService.queryDebugElement(
      componentFixture, cssSelector); 

      console.log('--------------', debugElement.nativeElement); 
      // expect(debugElement.nativeElement).toBe(null); 
      // expect(true).toBe(true); 
      expect(debugElement).not.toBeNull(); 
     }); 
    }); 
}); 

的specService.queryDebugElement情況如下:

queryDebugElement(fixture: ComponentFixture<any>, cssSelector: string): DebugElement { 
    fixture.detectChanges(); 

    return fixture.debugElement.query(By.css(cssSelector)); 
    } 

每當我使用

expect(true).toBe(true); 

expect(debugElement.nativeElement).toBe(null); 

expect(debugElement).not.toBeNull(); 
在測試兩個

,測試工作或常失敗,但每當我使用

expect(debugElement).toBeNull(); 

業力的碰撞所使用的瀏覽器(鉻/鉻/ PhantomJs測試),並沒有給出任何線索怎麼了。這不是一個簡單的「期望錯誤爲真」失敗,測試上下文完全崩潰。

您是否看到任何可以解釋此行爲的東西?

回答

2

使用expect(debugElement).toBeTruthy();,而不是expect(debugElement).not.toBeNull()因爲not.tobeNull()可能無法按預期的行爲當出現不確定的。如果您的debugElement未定義,可能會產生問題。

+0

好了THX,會做:) – Shireilia

+0

但你知道如何如果debugElement被定義,它會崩潰嗎?因爲如果帶有debugElement的元素被破壞,而不是瀏覽器崩潰,我至少會期望一個錯誤日誌或其他東西。 – Shireilia

+0

我認爲你的除了(debugElement)是拋出錯誤.. – saurav1405

6

角的DebugElement是一個相當複雜的對象,茉莉的expect似乎含有遞歸部分(或在足夠複雜,需要很多不同的函數調用至少算法)......因此直接在單元測試中使用的DebugElement不被推薦。它通常以深度遞歸和瀏覽器內存泄漏結束。

在你的情況,我會嘗試:

let nl: NodeList = componentFixture.nativeElement.querySelectorAll('.events-compact-event'); 

expect(nl.length).toBeFalsy; 

這樣,你不使用DebugElement,你從你做的那些在測試中有未定義的值(除危險不是需要未定義)。代碼覆蓋率和結果應該是等效的。

看一看這篇文章:https://medium.com/@martatatiana/poor-detective-angular2-browser-crash-and-debugelement-f0a651dbf33

+0

感謝羅姆提出的建議,我剛剛在一週前的文章中對這篇文章進行了介紹。但令人討厭的是不能正確使用DebugElement,這個功能非常好。我會嘗試解決您的解決方案,看看它是否能給出更好的結果。 – Shireilia

0

使用expect(Boolean(debugElement)).toBeTruthy(),而不是

  • expect(debugElement).not.toBeNull()
  • expect(debugElement).toBeTruthy()
+0

這是修復它的一種方法,但對我來說感覺有點不好意思。自從那篇文章之後我在測試中做了什麼,而不是直接在debug元素上進行測試,而是在像debugElement.nativeElement這樣的子屬性上進行測試,並且我所有的問題都沒有了。 – Shireilia