Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.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_Angular Material_Angular Components_Angular Forms_Angular Test - Fatal编程技术网

Angular 在角度测试中将窗体控件设置为“脏”

Angular 在角度测试中将窗体控件设置为“脏”,angular,angular-material,angular-components,angular-forms,angular-test,Angular,Angular Material,Angular Components,Angular Forms,Angular Test,我有以下组件模板: {{model.title}} 一些错误 在我的测试中,我想测试错误状态。但是,我需要访问测试中的输入控件“#checkbox”,并将其设置为dirty it('invalid上应显示错误',()=>{ const checkbox=fixture.debugElement.query(By.directive(MatCheckbox)) //我有mat复选框,但是不确定如何访问表单控件以设置为dirty }) 如果我将ViewChild添加到我的组件中,我可以在测试中

我有以下组件模板:


{{model.title}}
一些错误
在我的测试中,我想测试错误状态。但是,我需要访问测试中的输入控件“#checkbox”,并将其设置为dirty

it('invalid上应显示错误',()=>{
const checkbox=fixture.debugElement.query(By.directive(MatCheckbox))
//我有mat复选框,但是不确定如何访问表单控件以设置为dirty
})
如果我将ViewChild添加到我的组件中,我可以在测试中访问它:

@组件({
选择器:“我的复选框”,
templateUrl:'./checkbox.component.html',
样式URL:['./checkbox.component.scss']
})
导出类CheckboxComponent{
@Input()模型:任意;
//永远不要在生产中使用它,而是添加到测试中
@ViewChild('checkbox',{static:false})checkbox:NgModel;
}
...
//在这一点上,我可以通过组件访问测试
component.checkbox.control.markAsDirty();
但是,我希望在测试中访问模型,而不向组件本身添加变量,因为该模型从未使用过

编辑:我还尝试修改该值以将控件切换为“脏”:

it('invalid上应显示错误',(done)=>{
component.model.value=false//将值设置为未选中
fixture.detectChanges()
fixture.whenStable()然后(()=>{
const error=fixture.debugElement.query(By.directive(MatError))
//此处错误为null,已验证控件未标记为脏
完成();
})
})

我可以按如下方式抓取模型:

const model = fixture.debugElement.query(By.directive(MatCheckbox)).references['checkbox']
然后标记为肮脏

model.control.markAsDirty()

我能够抓取如下模型:

const model = fixture.debugElement.query(By.directive(MatCheckbox)).references['checkbox']
然后标记为肮脏

model.control.markAsDirty()

您不能直接使用特定控件本身fixture.debugElement.query(By.css(“#Id”))的Id进行检查吗?markAsDirty()

您不能直接使用特定控件本身fixture.debugElement.query(By.css(“#Id”))的Id进行检查吗。要获得访问权限,需要将组件遍历到该元素并找到对该元素的引用。如果您可以得到它,那么会有一个onNgmodelCange事件,您可以直接更改表单控件的脏值。这不应该是不可能的,但可能是那样的。阅读这篇文章@JohnPeters,它似乎意味着将ngModelChange添加到模板中只是为了测试。对于这种状态,您需要做的就是更改值。那就脏了。我还提到了如何尝试访问模型。你试过了吗?@JohnPeters是的,看起来很简单,也试过了。我将更新答案。这种类型的NgModel绑定会自动创建一个表单控件。要获得访问权限,需要将组件遍历到该元素并找到对该元素的引用。如果您可以得到它,那么会有一个onNgmodelCange事件,您可以直接更改表单控件的脏值。这不应该是不可能的,但可能是那样的。阅读这篇文章@JohnPeters,它似乎意味着将ngModelChange添加到模板中只是为了测试。对于这种状态,您需要做的就是更改值。那就脏了。我还提到了如何尝试访问模型。你试过了吗?@JohnPeters是的,看起来很简单,也试过了。我会更新答案。