Angular2 тестирование: в чем разница между DebugElement и NativeElement объекта в ComponentFixture?
В настоящее время я собираю некоторые рекомендации по тестированию приложений Angular 2 на уровне компонентов.
Я видел несколько учебных пособий, запрашивающих объект nativeelement объекта fixture для селекторов и тому подобное, например
it('should render "Hello World!" after click', async(() => {
builder.createAsync(HelloWorld).then((fixture: ComponentFixture<HelloWorld>) => {
fixture.detectChanges();
let el = fixture.nativeElement;
el.querySelector('h1').click();
fixture.detectChanges();
expect(el.querySelector('h1')).toHaveText('Hello World!');
});
}));Однако в тестовом семени Angular 2 juliemr она обращается к NativeElement через родительский объект DebugElement.
it('should render "Hello World!" after click', async(() => {
builder.createAsync(HelloWorld).then((fixture: ComponentFixture<HelloWorld>) => {
fixture.detectChanges();
let compiled = fixture.debugElement.nativeElement;
compiled.querySelector('h1').click();
fixture.detectChanges();
expect(compiled.querySelector('h1')).toHaveText('Hello World!');
});
}));Есть ли какие-либо конкретные случаи, когда вы использовали бы отладочный элемент приспособления.nativeElement над своим родным элементом?
4 ответов:
nativeElementвозвращает ссылку на элемент DOMDebugElementявляется классом Angular2, который содержит все виды ссылок и методов, имеющих отношение к исследованию элемента или компонента (см. Источник DebugNode и DebugElement
Чтобы добавить к уже упомянутому:
abstract class ComponentFixture { debugElement; // test helper componentInstance; // access properties and methods nativeElement; // access DOM detectChanges(); // trigger component change detection }
Взгляните на угловую дискуссию по этой теме и связанную с ней PR.
Главным образом:
fixture.componentInstance == fixture.debugElement.componentInstance; fixture.nativeElement == fixture.debugElement.nativeElement;
.nativeElement()возвращает дерево DOM, тогда какdebugElementвозвращает объект JS (дерево debugElement).debugElement- Это метод углового.
.nativeElement()это специфичный для браузера API, который возвращает или предоставляет доступ к дереву DOM. Но что делать, если приложение работает на не-браузерной платформе (например, сервер или веб-рабочий), в этом случае.nativeElement()может выдать ошибку.Если мы уверены, что наше приложение будет работать только в браузере, то без колебаний мы можем использовать
let el = fixture.nativeElement. Но если мы ... не уверены насчет платформы тогда быть на более безопасной стороне используйтеlet le = fixture.debugElement, потому что он возвращает простой объект JS.
Comments