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

时间:2017-12-29 04:57:27

标签: rspec capybara 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运行的浏览器之前有机会实际提交表单并将结果提交给数据库。

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

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

以下是我的Capybara配置。我有一个多租户应用(我使用apartment gem进行任何重要事项)所以我使用localhostlvh.me作为应用主机,如下所示,但我可以& #39;想象这会干扰上述情况。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

使用"真正的浏览器之一" 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