2016-12-26 67 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