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无论重要的是什么)所以我使用localhost
和lvh.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似乎没有足够快地提交表单的主要内容,如果未能解决你的问题,请参考以下文章
Rails - 安装 capybara-webkit 时遇到问题
有没有办法使用 Capybara 将按键发送到 Webkit?