Shi*_*lia 4 crash unit-testing jasmine angular
我在测试我的一个组件时遇到了一些麻烦.测试如下:
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();
});
});
});
Run Code Online (Sandbox Code Playgroud)
specService.queryDebugElement如下:
queryDebugElement(fixture: ComponentFixture<any>, cssSelector: string): DebugElement {
fixture.detectChanges();
return fixture.debugElement.query(By.css(cssSelector));
}
Run Code Online (Sandbox Code Playgroud)
每当我使用
expect(true).toBe(true);
Run Code Online (Sandbox Code Playgroud)
要么
expect(debugElement.nativeElement).toBe(null);
Run Code Online (Sandbox Code Playgroud)
要么
expect(debugElement).not.toBeNull();
Run Code Online (Sandbox Code Playgroud)
在TEST TWO中,无论何时使用,测试都会正常工作或失败
expect(debugElement).toBeNull();
Run Code Online (Sandbox Code Playgroud)
因业力崩溃使用的浏览器(使用chrome/chromium/PhantomJs测试)并没有提供任何发生的线索.这不是一个简单的"期望错误是真的"失败,测试上下文完全崩溃.
你看到任何可以解释这种行为的东西吗?
Angular DebugElement是一个相当复杂的对象,Jasmine expect似乎包含递归部分(或者至少是复杂到足以需要许多不同函数调用的算法)......因此DebugElement不建议直接在单元测试中使用.它通常以深度递归和浏览器内存泄漏结束.
在你的情况下,我会尝试:
let nl: NodeList = componentFixture.nativeElement.querySelectorAll('.events-compact-event');
expect(nl.length).toBeFalsy;
Run Code Online (Sandbox Code Playgroud)
这样,您就不会使用DebugElement,并且您不会在测试中有未定义值的风险(除了您需要未定义的值).代码覆盖率和结果应该是等效的.
看看这篇文章:https://medium.com/@martatatiana/poor-detective-angular2-browser-crash-and-debugelement-f0a651dbf33
| 归档时间: |
|
| 查看次数: |
1435 次 |
| 最近记录: |