单击 Capybara gem 的更新按钮时,我的实例未更新 [Rails / Rspec/ 测试]
When clicking update button with Capybara gem, my instance is not being updated [Rails / Rspec/ Testing]
简而言之,我正在开发一个 Rails 应用程序,现在正在测试我的控制器。
我使用 FactoryBot 生成要使用的实例,使用数据库清理器(截断)在每次测试后清理我的数据库,使用 Capybara 来测试我的控制器,模拟用户操作。
Factory bot 工作正常,我的实例生成正确,我可以与它们交互/测试它们。
Buyt 这是我的问题:
每当我测试控制器的“更新”方法时,我都希望在单击“保存”按钮时更新实例的选定属性的值。但是当我使用 p 标签检查值时(点击我的“保存”按钮之前和之后)没有任何改变!
我整个下午都在研究这个问题,希望有人能帮助我了解我做错了什么...
这是我的代码:
require 'rails_helper'
RSpec.describe "UserDetails", type: :controller do
render_views
describe "PATCH /update", focus: true do
before do
@user = create(:user, :amin)
@user_detail = create(:user_detail, :user_detail_user_2)
login_as(@user)
end
it "should be possible to update the user details" do
visit "/user_details/#{@user_detail.id}/edit"
expect(response).to have_http_status(:ok)
expect(page).to have_text("Edit your personal information")
expect(page.current_url).to match("/user_details/#{@user_detail.id}/edit")
p @user.user_detail.mobile_number # nil
p @user_detail.mobile_number # nil
expect(@user.user_detail.mobile_number.nil?).to be true
fill_in "user_detail[mobile_number]", with: "07 123 123"
expect(page).to have_button("Save")
click_link_or_button('Save')
expect(@user.user_detail.mobile_number).to eq("07 123 123") **#Failure/Error here**
end
end
end
这是我遇到的失败/错误:
Failures:
1) UserDetails PATCH /update should be possible to update the user details
Failure/Error: expect(@user.user_detail.mobile_number).to eq("071111111")
expected: "07 123 123"
got: nil
(compared using ==)
# ./spec/requests/user_details_controller_spec.rb:56:in `block (3 levels) in <top (required)>'
我的用户和 user_detail 实例都具有有效的 ID。 mobile_phone 属性没有验证,但我仍然希望在单击“保存”按钮时更新此值。
顺便说一句,我尝试了 运行 测试 js: true to checkCapybara cycle。一切都在正常进行。我什至看到正在渲染的视图显示了新的 phone 编号。但是当我检查 _spec 文件中的值时,我仍然得到 nil 作为值。
我该如何解决?有没有人解释为什么它不起作用?
非常感谢您!
我刚刚找到了解决方案...我在这里 post 而不是删除 post 因为我相信它会在未来帮助其他人(包括我自己)。
我们需要在您通过 Capybara 单击更新/创建按钮和我们要测试属性值是否更改之间使用“your_instance.reload”。
click_link_or_button('Save')
@user_detail.reload
expect(@user.user_detail.mobile_number).to eq("071111111")
现在控制台中的结果:
UserDetails
PATCH /update
nil
nil
"071111111"
"071111111"
should be possible to update the user details
Finished in 5.01 seconds (files took 8.98 seconds to load)
1 example, 0 failures
字面上一个简单的词。而且从来没有人谈论过它...我觉得很可笑。
祝大家愉快!
简而言之,我正在开发一个 Rails 应用程序,现在正在测试我的控制器。
我使用 FactoryBot 生成要使用的实例,使用数据库清理器(截断)在每次测试后清理我的数据库,使用 Capybara 来测试我的控制器,模拟用户操作。
Factory bot 工作正常,我的实例生成正确,我可以与它们交互/测试它们。
Buyt 这是我的问题: 每当我测试控制器的“更新”方法时,我都希望在单击“保存”按钮时更新实例的选定属性的值。但是当我使用 p 标签检查值时(点击我的“保存”按钮之前和之后)没有任何改变!
我整个下午都在研究这个问题,希望有人能帮助我了解我做错了什么...
这是我的代码:
require 'rails_helper'
RSpec.describe "UserDetails", type: :controller do
render_views
describe "PATCH /update", focus: true do
before do
@user = create(:user, :amin)
@user_detail = create(:user_detail, :user_detail_user_2)
login_as(@user)
end
it "should be possible to update the user details" do
visit "/user_details/#{@user_detail.id}/edit"
expect(response).to have_http_status(:ok)
expect(page).to have_text("Edit your personal information")
expect(page.current_url).to match("/user_details/#{@user_detail.id}/edit")
p @user.user_detail.mobile_number # nil
p @user_detail.mobile_number # nil
expect(@user.user_detail.mobile_number.nil?).to be true
fill_in "user_detail[mobile_number]", with: "07 123 123"
expect(page).to have_button("Save")
click_link_or_button('Save')
expect(@user.user_detail.mobile_number).to eq("07 123 123") **#Failure/Error here**
end
end
end
这是我遇到的失败/错误:
Failures:
1) UserDetails PATCH /update should be possible to update the user details
Failure/Error: expect(@user.user_detail.mobile_number).to eq("071111111")
expected: "07 123 123"
got: nil
(compared using ==)
# ./spec/requests/user_details_controller_spec.rb:56:in `block (3 levels) in <top (required)>'
我的用户和 user_detail 实例都具有有效的 ID。 mobile_phone 属性没有验证,但我仍然希望在单击“保存”按钮时更新此值。
顺便说一句,我尝试了 运行 测试 js: true to checkCapybara cycle。一切都在正常进行。我什至看到正在渲染的视图显示了新的 phone 编号。但是当我检查 _spec 文件中的值时,我仍然得到 nil 作为值。
我该如何解决?有没有人解释为什么它不起作用?
非常感谢您!
我刚刚找到了解决方案...我在这里 post 而不是删除 post 因为我相信它会在未来帮助其他人(包括我自己)。
我们需要在您通过 Capybara 单击更新/创建按钮和我们要测试属性值是否更改之间使用“your_instance.reload”。
click_link_or_button('Save')
@user_detail.reload
expect(@user.user_detail.mobile_number).to eq("071111111")
现在控制台中的结果:
UserDetails
PATCH /update
nil
nil
"071111111"
"071111111"
should be possible to update the user details
Finished in 5.01 seconds (files took 8.98 seconds to load)
1 example, 0 failures
字面上一个简单的词。而且从来没有人谈论过它...我觉得很可笑。
祝大家愉快!