RSpec模型关系

时间:2013-12-28 18:31:34

标签: ruby-on-rails rspec

我正在测试用户之间的关系。 用户模型:

class User < ActiveRecord::Base
  has_many :following, class_name: 'Follower', foreign_key: :follower_id, dependent: :destroy
  has_many :followers, foreign_key: :user_id, dependent: :destroy
end
跟随者模型:

class Follower < ActiveRecord::Base
  belongs_to :user
  belongs_to :follower, class_name: 'User'
  belongs_to :organization
end

测试失败:

it 'should unfollow user' do
  @user.following.create(user_id: @user2.id, is_friend: false)
  post 'follow', id: @user2.id
  expect(response).to be_success
  json = JSON.parse(response.body)
  expect(@user.following).to be_empty
end

我可以重建它来开始工作:

it 'should unfollow user' do
  @user.following.create(user_id: @user2.id, is_friend: false)
  post 'follow', id: @user2.id
  expect(response).to be_success
  json = JSON.parse(response.body)
  expect(Follower.where(follower_id: @user.id, user_id: @user2.id)).to be_empty
end

但我无法理解,为什么@ user.following不为空?方法工作正常并删除条目......

2 个答案:

答案 0 :(得分:1)

您的第一个测试是检查Ruby following对象中User的值。由于取消关注后该对象尚未重新加载/刷新,因此它保留原始值。

您的第二个测试是执行SQL操作,该操作从数据库中获取当前信息。

答案 1 :(得分:1)

在第一个示例中,您需要调用@user.reload从数据库重新加载@user对象,就在上一行expect行之前。在此之前,数据库更改不会修改您已实例化的对象。

在一个不相关的问题中,我不确定你为什么要解析响应主体而不对它做任何事情,除非在解析响应时要检查异常。在这种情况下,您可能会考虑以下内容:

expect { JSON.parse(response.body) }.not_to raise_exception