奇怪的rspec期望使用rails模型的行为

时间:2015-02-03 20:30:53

标签: ruby-on-rails rspec factory-bot

我是rails和rspec的新手,并且无法理解为什么这个测试失败了:

describe 'adding a friend' do
  it 'updates friends' do
    user = create(:user)
    expect {
      user.friends << create(:user)
    }.to change{user.friends}
  end
end

测试失败了:

Failure/Error: expect {
result should have changed, but is still #<ActiveRecord::Associations::CollectionProxy [#<User id: 1445, ...>]>

我使用byebug来确认friends集合最初是空的,并且rspec失败消息显示expect块确实修改了集合。

此外,该测试确实通过了:

it 'sanity test' do
  a = []
  expect {
    a << 1
  }.to change{a}
end

所以我不确定问题是什么。这是rails模型实现平等的方式吗?还是我正在使用Factory-girl? 我将如何测试朋友收藏集的修改?

提前致谢...

1 个答案:

答案 0 :(得分:1)

要修复规范,请检查朋友count是否已更改:

user = create(:user)
expect {
  user.friends << create(:user)
}.to change{user.friends.count}.by(1)

然而,这是一个非常糟糕的测试。首先,它没有测试你自己的任何代码。它测试Rails自己的测试套件已经涵盖的默认Rails行为。其次,最好测试正确的朋友是否出现在新的朋友集合中,而不仅仅是断言朋友集合已经改变:

user = create(:user)
friend = create(:user)
user.friends << friend

expect(user.friends).to include(friend)