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