如何解决使用 assert_changes 的功能测试失败
我的聊天应用有聊天类和消息类;当消息添加到聊天时,chat.updated_at 也应该更新(通过 belongs_to :chat,touch: true
实现)。
当我手动测试时,它工作正常,时间更新。然而,我下面的测试失败了,我不知道为什么。
test "sending a message should update chats updated timestamp" do
sign_in @user
assert_changes "@chat.updated_at" do
post messages_path(params: { message: {
text: 'Hello',to_id: @bob.id,chat_id: @chat.id
}})
assert_response :success
end
end
我只是收到错误 @chat.updated_at
没有改变。
我的聊天装置是
one:
id: 1
subject: nil
updated_at: <%= 2.hours.ago %>
解决方法
我认为你应该使用 model.reload https://apidock.com/rails/ActiveRecord/Persistence/reload
assert_changes "@chat.reload.updated_at" do
说明:
一旦从 DB 加载 Rails 模型,当您访问一个属性时,它将使用已经读取的值,并且不会一次又一次地进行相同的查询(除非明确告诉重新加载这样做)。在你的测试中,Ruby 只是简单地比较了 @chat.updated_at
之前和之后,但第二次没有第二次查询,只是一个缓存属性
您需要从数据库重新加载记录以获取测试中的对象以反映在数据库中执行的更改:
test "sending a message should update chats updated timestamp" do
sign_in @user
assert_changes "@chat.updated_at" do
post messages_path(params: { message: {
text: 'Hello',to_id: @bob.id,chat_id: @chat.id
}})
@chat.reload
assert_response :success
end
end
请记住,您的测试和控制器中的 @chat
指向内存中完全不同的对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。