Rails删除终端中的记录,但RSpec仍然显示在那里的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails删除终端中的记录,但RSpec仍然显示在那里的记录相关的知识,希望对你有一定的参考价值。

我正在创建一个应用程序,它将与前端交互以发布到数据库。在我的删除端点上,在终端中它将记录显示为已删除。但在我的测试中它仍然显示在那里。这是我的测试......

it 'can delete just one favorite leaving the rest' do
  user   = create(:user)
  vid    = video_payload
  vid_2  = video_payload_2

  post "/api/v1/users/#{user.id}/favorites/#{vid[:id]}", params:video_payload
  post "/api/v1/users/#{user.id}/favorites/#{vid_2[:id]}", params:video_payload_2

  expect(user.favorites.length).to eq(2)
  expect(user.favorites[1].video_id).to eq(vid_2[:id].to_i)

  delete "/api/v1/users/#{user.id}/favorites/#{vid[:id]}"

  expect(user.favorites.length).to eq(1)
  expect(user.favorites[0].video_id).to eq(vid_2[:id].to_i)
end

删除后的期望是失败的。

def destroy
    # user = User.find(params[:id])
    # favorite = Favorite.find_by(user_id: params[:id], video_id: params[:video_id])
    # render json: Favorite.delete(favorite.id)
    user = User.find(params[:id])
    favorite = Favorite.find_by(user_id: params[:id], video_id: params[:video_id])
    user.favorites.delete(favorite) if favorite
  end

我试过这两种方法来删除记录(注释掉和未注释)

收藏夹是用户和另一个表之间的连接。这是一对多关系。我已经尝试了与其他表和用户的依赖销毁,并没有仍然相同的错误。

答案

在你的规范中,你有这个:

expect(user.favorites.length).to eq(1)

试试这个。在检查收藏夹长度之前重新加载用户对象。

expect(user.reload.favorites.length).to eq(1)

Rails使用ActiveRecord::Associations::CollectionProxy来跟踪关联。当您第一次获取它时,它会缓存结果。 reload将确保您获得新的结果。

见:http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

以上是关于Rails删除终端中的记录,但RSpec仍然显示在那里的记录的主要内容,如果未能解决你的问题,请参考以下文章

RSpec:如何测试 Rails 记录器消息期望?

如何将内存中的 MongoDB 与 Rails、Mongoid 和 Rspec 一起使用?

RSpec 测试失败 - 使用显示套接字但缺少锁定文件

Rails - 显示随机记录但不显示当前记录

在 RSpec 中测试 Rails 视图:为啥当我想测试“索引”时它会路由到“显示”?

如何在 RSpec 测试中为 ActiveRecord 打开 SQL 调试日志记录?