angular - 我应该如何测试 Angular 6 中出现的错误消息

标签 angular testing angular6 angular-test

我正在测试一个组件的验证,我可以测试它是否是falsy,但是我不知道如何测试是否出现错误信息。

这是 HTML:

<input type="text" formControlName="name" class="form-control input-lg"
       placeholder="{{ 'validation.attributes.name' | translate }}"
       [ngClass]="{ 'is-invalid': !f.name.pristine  && f.name.errors }"/>
<div *ngIf="!f.name.pristine && f.name.errors" class="text-primary">
  <div *ngIf="f.name.errors.required">{{ 'validation.required' | translate:{'attribute':'Name'} }}
  </div>
</div>

这是我的实际测试:

it(`form should be invalid without name`, async(() => {
  comp.registerForm.controls['name'].setValue('');
  expect(comp.registerForm.valid).toBeFalsy();
}));

我应该如何测试出现的错误信息?

编辑:

我做了一个调试测试:

<div id="test" >qqq</div>

我可以验证它:

fixture = TestBed.createComponent(RegisterComponent);
de = fixture.debugElement.query(By.css('form'));
el = de.nativeElement;
const test = el.querySelector('#test');
expect(test.textContent).toContain('qqq'); // This will pass

但是当我添加条件时:

*ngIf="!f.name.pristine && f.name.errors"

我得到:

Cannot read property 'textContent' of null

只是为了确认,我有

fixture.detectChanges();

beforeEach()

最佳答案

你有两个选择:

  1. 使用 @ViewChild 元素:

    <div #errorMessage *ngIf="!f.name.pristine && f.name.errors" class="text-primary">
    
    // In your component
    @ViewChild() errorMessage: ElementRef;
    
  2. 使用文档查询选择器

    <div id="errorMessage" *ngIf="!f.name.pristine && f.name.errors" class="text-primary">
    
    // In your test file
    const el = fixture.nativeElement.querySelector('#errorMessage')
    

现在在你的测试中你可以使用其中之一:

expect(component.errorMessage.nativeElement).toBeTruthy();
expect(el).toBeTruthy();

两者都是 HTMLElement,因此您可以访问它们的属性:

el.innerHTML
el.className
...

关于angular - 我应该如何测试 Angular 6 中出现的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51134465/

相关文章:

javascript - Angular 2 : Object key as a variable in a template

Angular anchor 标记单击元素 ID 未显示

angular - 使用 i18n 选择管道

java - Play 2.0 并未运行所有测试

angular6 - 如何从浏览器控制台调用 angular 6 函数?

css - 如何自定义Toast窗口的样式?

javascript - Angular无限循环调用函数

java - 如何在 Spring Boot 中创建调用包含构造函数注入(inject)的服务的测试?

ruby - 当多个共享相同的名称和 ID 时,如何填写 Webrat 中的特定字段?

javascript - 如何在 Angular 6的折线图chart.js中仅显示每15个x标签?