Capybara Webkit似乎没有足够快地提交表单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Capybara Webkit似乎没有足够快地提交表单相关的知识,希望对你有一定的参考价值。

我正在使用Capybara来测试一个基本形式 - 当用户填写它并提交它应该创建一个新的User记录

it "creates a new user" do
  visit some_random_path

  # Fill In Form
  fill_in("name", with: "foo bar")
  fill_in("email", with: "foo.bar@example.com")

  expect do
    click_button("Submit")
  end.to change { User.count }.by(1)
end

expect块抛出错误,因为它没有看到User.count增加1.但是我注意到如果我做了类似的事情

click_button("Submit") && sleep(0.1)

它工作得很好!

所以看起来RSpec试图检查太快 - 即在Capybara运行的浏览器之前有机会实际提交表单并将结果提交给DB。

我没有使用任何javascript,只是一个简单的旧:webkit规范。

有关为什么会发生这种情况的任何想法?

以下是我的Capybara配置。我有一个多租户应用程序(我使用apartment gem无论重要的是什么)所以我使用localhostlvh.me作为app主机,如下所述,但我无法想象会干扰上述。

Capybara.configure do |config|
  config.ignore_hidden_elements = true
  Capybara.default_driver = :webkit
  config.javascript_driver = :webkit
end

Capybara::Webkit.configure do |config|
  config.block_unknown_urls
  config.allow_url("lvh.me")
end

RSpec.configure do |config|
  config.before(:suite) do
    Capybara.always_include_port = true
    # The default is to treat each spec as single tennat, in which case
    # we want to hit localhost. Hitting the Capbyara default of www.example.com
    # causes the apartment setup to try and parse the `www` as a subdomain
    Capybara.app_host = "http://localhost"
  end

  config.before(:each, multi_tenant: true) do
    # For multi-tenant specs, use "lvh.me"
    Capybara.app_host = "http://lvh.me"
  end
end

谢谢!

答案

当使用Capybara中的一个“真正的浏览器”驱动程序(除了rack_test之外几乎都是其中任何一个)时,单击按钮触发的任何操作都不会在click方法返回时完成。这意味着您需要检查页面上的可见更改,以指示操作已完成,然后再继续。在你的情况下,这将意味着什么

expect do
  click_button("Submit")
  expect(page).to have_text("New User Created") # whatever appears on screen to indicate successful creation of the user
end.to change { User.count }.by(1)

请注意,在编写功能测试时,对事物进行直接数据库检查通常被认为是一种糟糕的代码气味,您真的应该只检查用户索引页面上的新用户节目,确认显示成功消息或类似的东西,而不是检查User.count

以上是关于Capybara Webkit似乎没有足够快地提交表单的主要内容,如果未能解决你的问题,请参考以下文章

重定向导致 Capybara-webkit 失败

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

有没有办法使用 Capybara 将按键发送到 Webkit?

Capybara-Webkit:page.should_content() 没有实现?

在 capybara-webkit 中禁用声音

使用 RSpec + capybara-webkit 检查 JS 框是不是存在