单击 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

字面上一个简单的词。而且从来没有人谈论过它...我觉得很可笑。

祝大家愉快!