Ruby on rails Rspec::Matcher';改变';带接收器和消息的方法与块

Ruby on rails Rspec::Matcher';改变';带接收器和消息的方法与块,ruby-on-rails,activerecord,rspec,factory-bot,Ruby On Rails,Activerecord,Rspec,Factory Bot,我正在尝试删除关联。涉及的两个模型是用户和取消: class Cancellation < Active Record::Base belongs_to :taker, class_name: "User" end class User < ActiveRecord::Base has_many :taken_cancellations, class_name: "Cancellation", foreign_key: :taker_

我正在尝试删除关联。涉及的两个模型是
用户
取消

    class Cancellation < Active Record::Base
      belongs_to :taker, class_name: "User"
    end

    class User < ActiveRecord::Base
      has_many :taken_cancellations, class_name: "Cancellation", foreign_key: :taker_id
    end
单击链接“使其可用”
将在控制器中触发
user.taked\u cancellations.delete@cancellation

测试失败,出现以下错误:

taker should have been changed to nil, but is now #<User id: 1, name: "Taker User"...

如果我是对的,有人能解释一下吗?为什么会有这些不同的行为?

在第一种形式中,
取消.重新加载
会计算一次,结果对象会在调用
单击链接
方法前后发送消息。换句话说,调用
单击链接
后,不会重新加载
取消
对象

在第二种形式中,
cancellation.reload.taker
在调用
click\u link
之前和之后进行整体评估,因此
reload
有可能在数据库更新后生效


但是,请注意,根据您的配置,处理
单击链接结果的服务器可能在单独的线程中执行,因此在任何情况下,数据库更新和测试断言之间都存在竞争条件。

非常有意义。非常感谢。
taker should have been changed to nil, but is now #<User id: 1, name: "Taker User"...
expect { click_link "Make it available" }.to change { cancellation.reload.taker }.from(user).to nil