在 Rails 中,我应该在 capybara(或集成)测试中包含用户输入表单错误流吗?

Posted

技术标签:

【中文标题】在 Rails 中,我应该在 capybara(或集成)测试中包含用户输入表单错误流吗?【英文标题】:In rails, should I include user input form error flows on capybara (or integration) tests? 【发布时间】:2015-01-06 00:32:35 【问题描述】:

Rails 支持多种类型的测试:

模型测试 控制器测试 功能测试 集成测试

而且,与水豚一起,它还可以支持:

验收/集成/功能(取决于作者)测试

在某些网站上,我看到这些验收/集成/功能测试应该只测试特定的流程,而将边缘情况留给其他类型的测试。例如:

集成测试用于测试任意数量的控制器之间的交互。它们通常用于测试应用程序中的重要工作流程。

http://guides.rubyonrails.org/testing.html#integration-testing

虽然这些非常适合测试高级功能,但请记住,功能规范运行缓慢。无需使用 Capybara 测试通过您的应用程序的所有可能路径,而是将测试边缘案例留给您的模型、视图和控制器规范。

http://robots.thoughtbot.com/how-we-test-rails-applications

但我也看到了类似的东西:

您的目标应该是为应用中的每个流程编写一个集成测试:确保每个页面都被访问,每个表单一次正确提交一次,一次错误提交,并针对不同类型的用户测试每个流程,这些用户可能拥有不同的权限(以确保他们可以访问他们被允许访问的页面,而不是访问他们不允许访问的页面)。您应该对您的应用进行大量集成测试!

https://www.learnhowtoprogram.com/lessons/integration-testing-with-capybara

那么,这是我的问题:在 rails 中,我是否应该在 capybara(或集成)测试中包含用户输入表单错误流?

或者您认为编写视图测试来测试闪存消息的存在、使用 assigns 助手通过控制器测试测试失败流以及仅通过验收/集成/功能测试测试成功流是否足够?

编辑接受的答案是由于 cmets。

【问题讨论】:

【参考方案1】:

用户输入表单错误由 Rails 中的Active Record validations 处理。所以你可以用unit tests 覆盖这些。但是这些类型的测试仅验证您的模型上是否存在验证。除了允许您在其他框架或语言中重新创建模型并且仍然通过测试之外,我不确定这些类型的测试提供了多少实用程序。

【讨论】:

是的,Active Record 验证可以通过单元测试进行测试,尽管我倾向于不这样做。我认为 DHH 的说法是有道理的:“不要测试标准的 Active Record 关联、验证或范围。” Testing like the TSA。关于 capybara 测试,我想知道是否应该测试错误是否正确显示。你怎么看? 可能是一个单一的 UI 测试,用于测试一般情况下是否存在 Flash 消息。如果 Flash 消息作为应用程序布局的一部分存在,则不需要针对每个单独的用例进行测试。 我通常更喜欢在有错误的输入附近出现错误消息,而不是一般的 Flash 消息。每个表单只测试一个失败案例是个好主意吗? 有多种方法可以处理错误消息,包括客户端 javascript。我只会为每个测试一个实例。如果您的错误显示代码是模块化的,您可以只测试该模块并可能将其包含在页面中。 有趣。我喜欢尝试提取用于显示表单错误的代码并对该部分进行单元测试并将其包含在内的想法。我会试试的。谢谢。

以上是关于在 Rails 中,我应该在 capybara(或集成)测试中包含用户输入表单错误流吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中使用 Capybara 和 Selenium 测试 Google 地图标记

在 Rails 中使用 RSpec 和 Capybara 时未定义的方法“访问”

Rails - 安装 capybara-webkit 时遇到问题

如何使用rails cucumber,rspec,capybara在视图(dhtml)中测试动态部分?

Rails Cucumber使用Capybara测试AJAX

在 Cucumber + Capybara + PhantomJS 在 Rails 中调试 jQuery Ajax