Rails |黄瓜 |水豚 | click_button 生成 GET 请求
Rails | Cucumber | Capybara | click_button generates GET request
我有一个包含以下步骤的 Cucumber 场景:
def create_admin
@admin ||= FactoryGirl.create(:admin)
end
def sign_in
visit '/admins/sign_in'
fill_in "Email", with: @admin.email
fill_in "Password", with: @admin.password
save_and_open_page
click_button "Sign in"
end
### Given ###
Given /^I exist as an admin$/ do
create_admin
end
### WHEN ###
When /^I sign in with valid credentials$/ do
sign_in
end
### THEN ###
Then /^I see a Sign out link$/ do
page.should have_link "Sign out"
end
这是这些操作的测试日志:
Started GET "/admins/sign_in" for 127.0.0.1 at 2017-08-23 11:10:14 +0200
Processing by Devise::SessionsController#new as HTML
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (1.0ms)
Rendered devise/sessions/new.html.erb within layouts/application (130.1ms)
Completed 200 OK in 361ms (Views: 348.5ms | ActiveRecord: 0.0ms)
Started GET "/admins/sign_in?admin[email]=admin%40ca.coml&admin[password]=[FILTERED]&admin[remember_me]=0&commit=Sign+in" for 127.0.0.1 at 2017-08-23 11:10:14 +0200
Processing by Devise::SessionsController#new as HTML
Parameters: {"admin"=>{"email"=>"admin@ca.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (0.3ms)
Rendered devise/sessions/new.html.erb within layouts/application (3.2ms)
Completed 200 OK in 10ms (Views: 6.6ms | ActiveRecord: 0.0ms)
我对单击“登录”按钮似乎触发 GET 请求这一事实感到非常困惑。
由于这在开发中正常工作:
Started GET "/admins/sign_in" for 127.0.0.1 at 2017-08-23 11:08:26 +0200
Processing by Devise::SessionsController#new as HTML
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (1.1ms)
Rendered devise/sessions/new.html.erb within layouts/application (4.2ms)
Completed 200 OK in 37ms (Views: 35.6ms | ActiveRecord: 0.0ms)
Started POST "/admins/sign_in" for 127.0.0.1 at 2017-08-23 11:08:28 +0200
Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"nVSRKgJ33eZ1pW6FZGQhOFis/9/d/LS3Cshez4sBZYx2Fx/8mmmBfyB1C1VQZ84kA48zyhocu3MLlKxLaD0JlA==", "admin"=>{"email"=>"admin@ca.nl", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
Admin Load (0.7ms) SELECT "admins".* FROM "admins" WHERE "admins"."email" = ORDER BY "admins"."id" ASC LIMIT [["email", "admin@ca.nl"], ["LIMIT", 1]]
(0.3ms) BEGIN
SQL (0.4ms) UPDATE "admins" SET "current_sign_in_at" = , "sign_in_count" = , "updated_at" = WHERE "admins"."id" = [["current_sign_in_at", "2017-08-23 09:08:28.326296"], ["sign_in_count", 2], ["updated_at", "2017-08-23 09:08:28.327254"], ["id", 2]]
(7.5ms) COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 181ms (ActiveRecord: 8.8ms)
我哪里做错了?
我猜你正在使用 'rack_test' 驱动程序(而不是 运行 实际浏览器的启用 JS 的驱动程序之一)并且不需要 'capybara/rails' 它告诉 'rack_test' 驱动程序查找 data-method
属性并使用它来设置 POST 与 GET,或者您的表单被编写为需要 JS。
如果这两种情况都不是,请 post HTML 形式
我有一个包含以下步骤的 Cucumber 场景:
def create_admin
@admin ||= FactoryGirl.create(:admin)
end
def sign_in
visit '/admins/sign_in'
fill_in "Email", with: @admin.email
fill_in "Password", with: @admin.password
save_and_open_page
click_button "Sign in"
end
### Given ###
Given /^I exist as an admin$/ do
create_admin
end
### WHEN ###
When /^I sign in with valid credentials$/ do
sign_in
end
### THEN ###
Then /^I see a Sign out link$/ do
page.should have_link "Sign out"
end
这是这些操作的测试日志:
Started GET "/admins/sign_in" for 127.0.0.1 at 2017-08-23 11:10:14 +0200
Processing by Devise::SessionsController#new as HTML
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (1.0ms)
Rendered devise/sessions/new.html.erb within layouts/application (130.1ms)
Completed 200 OK in 361ms (Views: 348.5ms | ActiveRecord: 0.0ms)
Started GET "/admins/sign_in?admin[email]=admin%40ca.coml&admin[password]=[FILTERED]&admin[remember_me]=0&commit=Sign+in" for 127.0.0.1 at 2017-08-23 11:10:14 +0200
Processing by Devise::SessionsController#new as HTML
Parameters: {"admin"=>{"email"=>"admin@ca.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (0.3ms)
Rendered devise/sessions/new.html.erb within layouts/application (3.2ms)
Completed 200 OK in 10ms (Views: 6.6ms | ActiveRecord: 0.0ms)
我对单击“登录”按钮似乎触发 GET 请求这一事实感到非常困惑。 由于这在开发中正常工作:
Started GET "/admins/sign_in" for 127.0.0.1 at 2017-08-23 11:08:26 +0200
Processing by Devise::SessionsController#new as HTML
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (1.1ms)
Rendered devise/sessions/new.html.erb within layouts/application (4.2ms)
Completed 200 OK in 37ms (Views: 35.6ms | ActiveRecord: 0.0ms)
Started POST "/admins/sign_in" for 127.0.0.1 at 2017-08-23 11:08:28 +0200
Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"nVSRKgJ33eZ1pW6FZGQhOFis/9/d/LS3Cshez4sBZYx2Fx/8mmmBfyB1C1VQZ84kA48zyhocu3MLlKxLaD0JlA==", "admin"=>{"email"=>"admin@ca.nl", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
Admin Load (0.7ms) SELECT "admins".* FROM "admins" WHERE "admins"."email" = ORDER BY "admins"."id" ASC LIMIT [["email", "admin@ca.nl"], ["LIMIT", 1]]
(0.3ms) BEGIN
SQL (0.4ms) UPDATE "admins" SET "current_sign_in_at" = , "sign_in_count" = , "updated_at" = WHERE "admins"."id" = [["current_sign_in_at", "2017-08-23 09:08:28.326296"], ["sign_in_count", 2], ["updated_at", "2017-08-23 09:08:28.327254"], ["id", 2]]
(7.5ms) COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 181ms (ActiveRecord: 8.8ms)
我哪里做错了?
我猜你正在使用 'rack_test' 驱动程序(而不是 运行 实际浏览器的启用 JS 的驱动程序之一)并且不需要 'capybara/rails' 它告诉 'rack_test' 驱动程序查找 data-method
属性并使用它来设置 POST 与 GET,或者您的表单被编写为需要 JS。
如果这两种情况都不是,请 post HTML 形式