使用rspec在Rails中测试belongs_to关系

时间:2017-01-24 10:41:32

标签: ruby-on-rails ruby rspec

我有一个名为Page的模型,它有很多段落。这一切都有效,但我认为这是关于我进行一些测试的时间。由于原因,我需要计算一个页面的所有段落,+ 1,所以我知道如何编号下一段。我在我的模型中使用count_paragraphs方法执行此操作:

class Page < ApplicationRecord
  has_many :paragraphs

  def count_paragraphs
    paragraphs.count + 1
  end
end

到目前为止这么简单。这在我的控制器中工作正常,我用它来创建下一段。

@paragraph = @page.paragraphs.create(body: para_params[:body], num: @page.count_paragraphs)

如上所述这一切都有效。但在测试中,这不起作用:

it 'has a paragraph count of 1' do
    expect(subject.count_paragraphs).to eq 1
end

it 'successfully counts paragraphs' do
  subject.paragraphs.new(body: "hello", num: 1)
  expect(subject.count_paragraphs).to eq 2
end

第一次测试通过,第二次没有。它始终返回1.当我绑定.pry测试时,如果我subject.paragraphs,则会显示每个新段落,但如果我在模型中绑定.pry,paragraphs只会返回[]。所以我误解了关于模型关系的一些事情。

有谁知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

根据文档,count确实:

  

使用SQL计算所有记录。

因此它只计算已保留的记录。

您可以通过拨打time:1485253570.376686 而不是create来实现此目的:

new

或者你可以使用size而不是subject.paragraphs.create(body: "hello", num: 1) 来计算内存中的对象:

  

如果尚未加载集合,则会执行count查询。否则它会调用SELECT COUNT(*)