我有一个控制器,我有一个接受表单的保存方法。
ctrl.save = function(form) {
if (!form.$valid) return;
...
}
这对于使用表单非常方便,因为我可以根据其有效性,状态等轻松访问值并执行某些操作。
if(form.someField.$dirty) { ... }
我使用这种方法开发了大量代码,并且在考虑单元测试之前没有遇到任何问题。有没有办法可以使用一些Angular模拟对象轻松地模拟表单,或者这是一种糟糕的方法?我关心访问该方法中的表单的部分原因是该表单有多个部分,每个部分根据其状态独立调用服务器。换句话说,我不会打电话来更新没有改变的东西。记住这一点,这是一种糟糕的方法吗?我可以采用哪种替代方法来对这种保存方法进行单元测试?
答案 0 :(得分:0)
我不确定这是否是解决这个问题的一个很好的解决方案,但它似乎有效,让我可以模拟表单,而无需独立处理所有的HTML。
beforeEach(function () {
//Set up a mocked form
formMock = {
$valid: false,
firstName: { $dirty: false, $viewValue: '' },
lastName: { $dirty: false, $viewValue: '' },
emailAddress: { $dirty: false, $viewValue: '' },
password: { $dirty: false, $viewValue: '' },
address: { $dirty: false, $viewValue: '' },
city: { $dirty: false, $viewValue: '' },
selectedState: { code: '' },
zip: { $dirty: false, $viewValue: '' }
};
});
然后在我的测试中,我只是将这个对象传递给期望表单的方法。
it('should do the stuff', function() {
ctrl.save(formMock);
expect(mockedService.spiedMethod).toHaveBeenCalled();
}
我意识到这不是一个有角度的模拟对象,但似乎只要包含控制器/服务所期望的属性,就可以在评估测试条件之前设置这些值并进行更改。
it('should do the stuff', function() {
formMock.firstName.$viewValue = 'Hello';
ctrl.save(formMock);
expect(mockedService.spiedMethod).toHaveBeenCalled();
}
在我的情况下,我正在测试spied方法中对传入的值起作用的条件,我真的只关心基于我提供的条件,spied方法是,或者没有被调用。