【发布时间】:2020-05-11 00:02:51
【问题描述】:
我有一个看起来像这样的测试:
...
component.registerForm.controls['username'].setValue('VALID USERNAME');
fixture.detectChanges();
expect(component.registerForm.valid).toEqual(true); // FIRST ASSERTION
const errors = fixture.debugElement.queryAll(By.css('.error.username'));
expect(errors.length).toBe(0); // <-- SECOND ASSERTION: IT VAILS HERE!!!
问题在于,即使表单有效并且第一个断言通过,第二个断言也会失败,因为显示“必需”错误消息。对我来说,看起来好像表单已更新,而 fixture.debugElement 没有更新,因此它显示了初始错误。 IE。它忽略设置username 值。
更新:
我有非常相似的问题,并且相信来源可能是相同的:我有一些测试用例我想确保我的表单验证设置正确(即有效用例导致有效表单,无效用例导致无效表单)(我将表单简化为仅username):
getUsernameCases().forEach((testCase) => {
it(`should be valid: ${testCase.valid}`, () => {
component.myForm.get('username').setValue(testCase.username);
component.registerForm.updateValueAndValidity();
fixture.detectChanges();
component.registerForm.updateValueAndValidity(); // Second time to make sure order does not matter
expect(component.myForm.valid).toBe(testCase.valid); // ALWAYS INVALID HERE
});
});
问题是无论值如何,表单总是无效的。它有required 错误 - 这意味着它显示了表单初始状态。在setValue之前。
【问题讨论】:
-
我实际上会退后一步,问问这个测试的目的是什么。看起来你在测试 Angular 比在测试你自己的逻辑更多。充其量您正在测试此表单上的验证是否设置正确。
-
@joshrathke 我不同意你的看法。这只是一个简单的例子,但我想测试的是:1)我想看到我认为有效的用户名不会导致表单验证错误 2)我想看到无效(以某种方式)用户名导致适当的错误消息(这里我有
.error.username,但对于缺失值,我可能有类似.error.username.required) -
查看您正在测试的代码会很有帮助。一个最小的可重现示例。
-
其次是你正在测试的代码,也许还有更多的实际测试代码。您如何构建夹具等等。
-
能否也添加 HTML 代码?堆叠闪电战会很棒。请提供详细代码,因为代码的另一部分可能是您的问题的原因。
标签: angular angular-test