我正在测试用户之间的关系。 用户模型:
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不为空?方法工作正常并删除条目......
答案 0 :(得分:1)
您的第一个测试是检查Ruby following
对象中User
的值。由于取消关注后该对象尚未重新加载/刷新,因此它保留原始值。
您的第二个测试是执行SQL操作,该操作从数据库中获取当前信息。
答案 1 :(得分:1)
在第一个示例中,您需要调用@user.reload
从数据库重新加载@user对象,就在上一行expect
行之前。在此之前,数据库更改不会修改您已实例化的对象。
在一个不相关的问题中,我不确定你为什么要解析响应主体而不对它做任何事情,除非在解析响应时要检查异常。在这种情况下,您可能会考虑以下内容:
expect { JSON.parse(response.body) }.not_to raise_exception