Angular 4 ngModel 在测试中输入更改后未更新
Angular 4 ngModel not updated after input change in tests
我有一个简单的应用程序,它有 1 个输入:
@Component({ selector: 'mycomponent', styles: [
], template: `
<div class="new-stuff">
<div>
<div>
Name: <input type="text" class="new-stuff-name" [(ngModel)]="stuff.name"/>
</div>
<div class="new-stuff-name-error" *ngIf="nameError != null">
{{nameError}}
</div>
</div>
<button class="new-stuff-save" (click)="checkStuff()">Add idea</button>
</div> `, })
export class StuffComponent implements OnInit {
public stuff = {name: ''};
public allStuff = [];
public checkStuff() {
if (this.stuff.name.length === 0) {
this.nameError = 'The name field cannot be empty';
}
if (this.stuff.name.length > 0) {
this.allStuff.push(this.stuff);
this.stuff= { name: ''};
}
}
}
当我 运行 应用程序时,我看到值发生变化并且一切看起来都捆绑在一起,但是当我尝试测试当我更改输入框中的值并单击按钮时,错误消息不是显示错误消息仍然显示,因为输入值没有改变。
这是我的 Jasmine 测试:
describe(`stuff`, () => {
let comp: StuffComponent ;
let fixture: ComponentFixture<StuffComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [StuffComponent ],
schemas: [NO_ERRORS_SCHEMA],
imports: [FormsModule],
}).compileComponents();
fixture = TestBed.createComponent(StuffComponent );
comp = fixture.componentInstance;
}));
describe('adding a new stuff', () => {
let stuffNameInput;
let saveButton;
beforeEach(() => {
stuffNameInput = fixture.nativeElement
.querySelectorAll('.new-stuff-name')[0];
saveButton = fixture.debugElement.nativeElement.querySelector(
'.new-stuff-save');
});
describe('when is successfull', () => {
beforeEach(async(() => {
stuffNameInput.value = 'New Stuff';
stuffNameInput.dispatchEvent(new Event('input'));
saveButton.click();
fixture.detectChanges();
}));
it('should display an error', () => {
let errorDiv = fixture.nativeElement
.querySelectorAll('.new-stuff-desc-error');
expect(errorDiv.length)
.toBe(0, 'Error message displayed');
});
});
});
});
我尝试了多种方法,将 async 替换为 fakeAsync,调用 tick 函数,将点击移动到 fixture.whenStable().then 块内,将 div 的检查移动到 fixture.whenStable().然后阻塞。到目前为止没有任何效果。
我正在使用 angular
的 4.1.3
版本
我发现在我的测试中 mousedown 比 click() 效果更好:
const e: Event = document.createEvent('HTMLEvents');
e.initEvent('mousedown', false, true);
itemElements[1].nativeElement.dispatchEvent(e);
回答我自己的问题以记录问题。
使用 stuff.name 作为 ngModel 效果不佳。
我将 stuff.name 更改为名称,它开始工作了
我有一个简单的应用程序,它有 1 个输入:
@Component({ selector: 'mycomponent', styles: [
], template: `
<div class="new-stuff">
<div>
<div>
Name: <input type="text" class="new-stuff-name" [(ngModel)]="stuff.name"/>
</div>
<div class="new-stuff-name-error" *ngIf="nameError != null">
{{nameError}}
</div>
</div>
<button class="new-stuff-save" (click)="checkStuff()">Add idea</button>
</div> `, })
export class StuffComponent implements OnInit {
public stuff = {name: ''};
public allStuff = [];
public checkStuff() {
if (this.stuff.name.length === 0) {
this.nameError = 'The name field cannot be empty';
}
if (this.stuff.name.length > 0) {
this.allStuff.push(this.stuff);
this.stuff= { name: ''};
}
}
}
当我 运行 应用程序时,我看到值发生变化并且一切看起来都捆绑在一起,但是当我尝试测试当我更改输入框中的值并单击按钮时,错误消息不是显示错误消息仍然显示,因为输入值没有改变。
这是我的 Jasmine 测试:
describe(`stuff`, () => {
let comp: StuffComponent ;
let fixture: ComponentFixture<StuffComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [StuffComponent ],
schemas: [NO_ERRORS_SCHEMA],
imports: [FormsModule],
}).compileComponents();
fixture = TestBed.createComponent(StuffComponent );
comp = fixture.componentInstance;
}));
describe('adding a new stuff', () => {
let stuffNameInput;
let saveButton;
beforeEach(() => {
stuffNameInput = fixture.nativeElement
.querySelectorAll('.new-stuff-name')[0];
saveButton = fixture.debugElement.nativeElement.querySelector(
'.new-stuff-save');
});
describe('when is successfull', () => {
beforeEach(async(() => {
stuffNameInput.value = 'New Stuff';
stuffNameInput.dispatchEvent(new Event('input'));
saveButton.click();
fixture.detectChanges();
}));
it('should display an error', () => {
let errorDiv = fixture.nativeElement
.querySelectorAll('.new-stuff-desc-error');
expect(errorDiv.length)
.toBe(0, 'Error message displayed');
});
});
});
});
我尝试了多种方法,将 async 替换为 fakeAsync,调用 tick 函数,将点击移动到 fixture.whenStable().then 块内,将 div 的检查移动到 fixture.whenStable().然后阻塞。到目前为止没有任何效果。
我正在使用 angular
的4.1.3
版本
我发现在我的测试中 mousedown 比 click() 效果更好:
const e: Event = document.createEvent('HTMLEvents');
e.initEvent('mousedown', false, true);
itemElements[1].nativeElement.dispatchEvent(e);
回答我自己的问题以记录问题。
使用 stuff.name 作为 ngModel 效果不佳。
我将 stuff.name 更改为名称,它开始工作了