在向验证标记添加ngIf
语句时,我的测试套件会中断。
如果字段无效,我有一个显示错误消息的div。之前,这些错误显示在页面加载时。现在我想只在用户与输入字段交互后才显示错误。添加ngIf
语句似乎是完美的,但它打破了我的测试套件。
这完美地运作:
<div data-ng-messages="userForm.name.$error">
<!-- some input field... -->
</div>
这种测试变得不稳定且不可靠。
<div data-ng-messages="userForm.name.$error" data-ng-if="userForm.name.$touched">
<!-- some input field... -->
</div>
例如,我的一个功能规范尝试填写表单,提交和重新加载页面以查看值是否持久化。此测试在没有ngIf
语句的情况下运行良好,但现在页面在页面重新加载时具有旧的(未更新的)值。甚至不调用控制器方法(例如UsersController#update
如果它是更新表单)。
将if语句更改为userForm.name.$dirty
会使测试更频繁地通过...我想这里引入了某种竞争条件,可能因为$ dirty响应速度更快,这会使测试更频繁地通过..
我尝试了capybara-angular gem,描述为 AngularJS与Capybara 的稳定集成测试。不幸的是,每次我尝试使用webkit驱动程序访问页面时都会出现超时故障。我在该存储库的一个问题中描述了我的问题。
我已经设法在Unreliable/Flakey Capybara/AngularJS Integration Tests With Timing Issues的帮助下完成了更多测试。我在写这个问题之前就读过它,但直到现在我还没有得到解决方案。我们的想法是隐藏Angular应该呈现数据的部分页面(似乎Capybara不知道它应该等待Angular进行绑定)。这解决了我的一些问题,但它并不是最好的解决方案,因为它会给用户带来更糟糕的体验(实际上你可以看到表单在加载页面时被隐藏,然后在半秒钟之后就会显示出来)。< / p>
我设法在capybara-ng gem的帮助下通过了测试,但是我必须直接与Angular交互(比如ng_model('model.attribute').set('value')
才能使它工作。更优雅的解决方案是找到一个等待Angular进行绑定的方法。