Angular的ngIf语句打破了Capybara测试

时间:2016-05-11 10:41:09

标签: ruby-on-rails angularjs capybara capybara-webkit

在向验证标记添加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如果它是更新表单)。

宝石

  • rspec-rails 3.4.2
  • capybara 2.7.1
  • capybara-webkit 1.11.1
  • database_cleaner 1.5.3

更新

将if语句更改为userForm.name.$dirty会使测试更频繁地通过...我想这里引入了某种竞争条件,可能因为$ dirty响应速度更快,这会使测试更频繁地通过..

更新2

我尝试了capybara-angular gem,描述为 AngularJS与Capybara 的稳定集成测试。不幸的是,每次我尝试使用webkit驱动程序访问页面时都会出现超时故障。我在该存储库的一个问题中描述了我的问题。

更新3

我已经设法在Unreliable/Flakey Capybara/AngularJS Integration Tests With Timing Issues的帮助下完成了更多测试。我在写这个问题之前就读过它,但直到现在我还没有得到解决方案。我们的想法是隐藏Angular应该呈现数据的部分页面(似乎Capybara不知道它应该等待Angular进行绑定)。这解决了我的一些问题,但它并不是最好的解决方案,因为它会给用户带来更糟糕的体验(实际上你可以看到表单在加载页面时被隐藏,然后在半秒钟之后就会显示出来)。< / p>

更新4

我设法在capybara-ng gem的帮助下通过了测试,但是我必须直接与Angular交互(比如ng_model('model.attribute').set('value')才能使它工作。更优雅的解决方案是找到一个等待Angular进行绑定的方法。

0 个答案:

没有答案