我使用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进行任何重要事项)所以我使用localhost
和lvh.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
谢谢!
答案 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
。