Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 测试中不会发生模板更新_Angular_Testing_Angular Material_Jasmine - Fatal编程技术网

Angular 测试中不会发生模板更新

Angular 测试中不会发生模板更新,angular,testing,angular-material,jasmine,Angular,Testing,Angular Material,Jasmine,我正在测试Angular代码,似乎对模板更新有一些误解。 我正在努力实现的目标是: 我实现了一个组件,它是一个简单的searchInput,可以通过点击按钮来清除。[下面的模板]这在实践中效果很好,但我想为它编写一个测试 <mat-form-field> <mat-icon matPrefix>search</mat-icon> <input #searchInput matInput (input)="onSearch(searchInput.

我正在测试Angular代码,似乎对模板更新有一些误解。 我正在努力实现的目标是: 我实现了一个组件,它是一个简单的searchInput,可以通过点击按钮来清除。[下面的模板]这在实践中效果很好,但我想为它编写一个测试

<mat-form-field>
  <mat-icon matPrefix>search</mat-icon>
  <input #searchInput matInput (input)="onSearch(searchInput.value)"
         [placeholder]="placeholder">
  <button class="clear-search-button" mat-button *ngIf="searchInput.value" matSuffix mat-icon-button 
          (click)="searchInput.value=''; onSearch('')">
    <mat-icon>close</mat-icon>
  </button>
</mat-form-field>
我的问题是,无论我如何尝试获取按钮,它似乎都没有添加到DOM中,因为我总是在
resetBtn.click()行上获取“TypeError:Cannot read property”click“of null”


我对模板测试的理解是否存在根本性问题,或者是否存在任何愚蠢的打字错误?

你的问题是,你可能认为输入功能正在被触发,但事实并非如此。虽然dom没有被触发,但这是可能发生的,因为您刚刚输入了文本,但在测试中输入事件没有被触发,您必须手动触发它

你要做的就是像这样触发它:

input.value = 'someSearch';
input.dispatchEvent(new Event('input'));
我的例子是:

let input = fixture.debugElement.query(By.css('input')).nativeElement;
input.value = '11';
input.dispatchEvent(new Event('input'));
工作示例:
您的问题是,您可能认为输入功能正在被触发,但事实并非如此。虽然dom没有被触发,但这是可能发生的,因为您刚刚输入了文本,但在测试中输入事件没有被触发,您必须手动触发它

你要做的就是像这样触发它:

input.value = 'someSearch';
input.dispatchEvent(new Event('input'));
我的例子是:

let input = fixture.debugElement.query(By.css('input')).nativeElement;
input.value = '11';
input.dispatchEvent(new Event('input'));
工作示例:

您的组件是否使用OnPush策略?我相信您使用的是input.value,它不会更新模板。而是将一个值设置为searchInput.value,然后按钮将在DOM中可见,您应该能够执行测试用例。@Eliran Els是的。这是个什么问题?@Sneha我该如何引用它?@chund尝试在测试床中覆盖您的组件以使用默认更改检测<代码>TestBed.overrideComponent(TestComponent,{set:new Component({selector:'test',template:``,changeDetection:ChangeDetectionStrategy.Default})})您的组件是否使用OnPush策略?我相信您正在使用input.value设置值,该值不会更新模板。而是将一个值设置为searchInput.value,然后按钮将在DOM中可见,您应该能够执行测试用例。@Eliran Els是的。这是个什么问题?@Sneha我该如何引用它?@chund尝试在测试床中覆盖您的组件以使用默认更改检测<代码>TestBed.overrideComponent(TestComponent,{set:new Component({selector:'test',template:``,changeDetection:ChangeDetectionStrategy.Default})})有趣的想法,但我不知道调用或不调用onSearch()函数应该做什么,因为btn只依赖于存在的searchInput的值。此外,我现在获得
input.dispatchEvent不是一个函数
请在编辑中列出我的示例。由于dom没有改变,我遇到了很多麻烦,所以我尝试了一下。另外,您可能想在问题中添加您的测试床。谢谢,我添加了一个工作示例。我认为您缺少的是
nativeElement
。这是一个有趣的想法,但我不知道调用或不调用onSearch()函数应该如何做,因为btn只依赖于存在的searchInput的值。此外,我现在获得
input.dispatchEvent不是一个函数
请在编辑中列出我的示例。由于dom没有改变,我遇到了很多麻烦,所以我尝试了一下。另外,您可能想在问题中添加您的测试床。谢谢,我添加了一个工作示例。认为您缺少的是
nativeElement