ruby-on-rails - Rails 集成测试 : Is Capybara necessary for interacting with Javascript?

标签 ruby-on-rails ruby ruby-on-rails-4 testing

我是 Rails 测试的新手,正在尝试进行集成测试。我正在处理一个 Rails 4.2 项目,我在默认的 Minitest 框架中编写了一些简单的测试。我很快就到了需要通过单击按钮并验证模式是否出现来与 html 中的 javascript 进行交互的地步。

根据我所做的研究,使用 Minitest 附带的语法和驱动程序似乎不可能做任何类似的事情。为此,我需要使用 Caypbara 或类似的东西。

首先 - 真的是这样吗?真的没有办法用 Rails 中的默认设置测试 Javascript 吗?

假设是这种情况,我已将 Capybara 引入我的项目以利用它的 DSL 和驱动程序来测试 Javascript,但在这样做时,它使我的初始测试变得毫无用处。它们不再工作,因为 Capybara DSL 覆盖了 assert_select 方法,迫使我使用 Capybara 语法来编写测试——这不是我反对的,我只是想弄清楚这一点。

所以好像如果我想测试 Javascript,那么我需要使用 Capybara?如果我引入 Capybara,那么我所有的测试都需要使用 Capybara 语法?如果这是真的,那么我似乎应该从一开始就在所有项目中使用 Capybara。

最佳答案

回答您的问题:

  • 无法使用 Rails 中的默认设置来测试 Javascript。你需要 Capybara,因为它实现了一个 smart wait当 DOM 可能被 Javascript 修改时,以及可以解释 Javascript 的 Capybara 驱动程序。

  • 您可以通过仅在这些对象上include Capybara::DSL 来选择哪些测试对象使用 Capybara。您不需要在所有测试中都包含它。

现在,我不建议一半的集成测试使用 Capybara,一半不使用。它最终会使您或其他人感到困惑。

这是我推荐的测试设置:

  1. 将 Controller 或模型中的一些逻辑提取到服务对象中,并使用 require 'test_helper' 测试它们,这不会加载整个 Rails 堆栈。它将使这些测试非常快。

  2. 将其余的单元测试保留在简单的 minitest 中(当然,您不需要 Capybara 测试它们)并尽可能快地运行。您仍然需要require 'rails_helper' 来加载 Rails 堆栈以测试模型、 View 和 Controller 。

  3. 使用 Capybara 进行所有集成测试。与您的单元测试相比,这些应该更少,并且运行速度会非常慢,因为您将使用 Javascript 驱动程序。您仍然可以选择在哪些集成测试中使用哪个驱动程序,以避免在不需要时使用速度较慢的 Javascript 驱动程序。

将 Capybara 包含在您的集成测试中:

# test/rails_helper.rb
require "capybara/rails"

class ActionDispatch::IntegrationTest
  include Capybara::DSL
end

更改当前驱动程序:

# test/integration/some_integration_test.rb
class SomeIntegrationTest < ActionDispatch::IntegrationTest
  # the default Capybara driver is :rack_test
  test "use javascript driver" do
    Capybara.current_driver = :poltergeist # which uses phantomjs
    # visit, clicks and assertions
    Capybara.use_default_driver
  end
end

可以将 Capybara.current_driverCapybara.use_default_driver 提取到一个模块中,然后放入 setupteardown 方法,如果你想重用它的话。

关于ruby-on-rails - Rails 集成测试 : Is Capybara necessary for interacting with Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43693667/

相关文章:

ruby-on-rails-4 - 未定义的方法 'document' 为 nil :NilClass while running Rails-tutorial with rspec

javascript - CoffeeScript 条件 rails

mysql - 通过另一个外键关联外键

javascript - Ajax删除不会刷新页面

ruby-on-rails - 模式迁移的非公共(public)模式

ruby-on-rails - Bootstrap 日期选择器默认值 simple_form_for

windows - Ruby:Watir 无法连接到在 'default' 桌面上以非管理员帐户运行的 IE

html - 在网格中显示使用 PaperClip 上传的图像缩略图

ruby - 如何将多个值推送到同一个哈希键

ruby-on-rails - object_id 和 id 有什么区别?