如何使用Rspec测试调用find_or_initialize_by的初始化方法?

时间:2017-08-14 15:35:00

标签: ruby-on-rails rspec ruby-on-rails-5

如何编写测试以检查此find_or_initialize_by方法中的initialize块?

def initialize(document, user)
  @document = document
  @api = @document.api_version
  @template = @document.template
  @user = user
  @brand = @user.brand
  @vars = master_var_hash.extend Hashie::Extensions::DeepFind

  template_variables.each do |t|
    @document.template_variables.find_or_initialize_by(name: t.name) do |d|
      d.name           = t.name
      d.tag            = t.tag
      d.box_name       = t.box_name
      d.designator     = t.designator
      d.order_index    = t.order_index
      d.master_id      = t.id
      d.editable       = t.editable
      d.editable_title = t.editable_title
      d.html_box       = t.box.stack.html_box if @api == :v3
      d.text = t.name == 'title' ? default_title : user_value(t)
    end
  end
end

我希望能够测试是否已从类@document中为TemplateVariables的{​​{1}}分配了正确的值。在我的报道报告中,我甚至无法进入TemplateVariable区块。

我的尺寸测试并没有真正检查我想在这里测试的内容:

find_or_initialize_by

如何编写测试来检查所有这些值并覆盖这些行?

1 个答案:

答案 0 :(得分:1)

您可以使用

expect(document).to receive_message_chain(:template_variables, :find_or_initialize_by).exactly(8).times

但这是一团糟,你还必须检查每个电话是否有适当的参数。

我建议将其解压缩为一种方法: Document#initialize_variables(template_variables)

然后你可以像

一样测试它

expect(document).to receive(:initialize_variables).with(expected_hash)

然后你可以用规范覆盖Document#initialize_variables并深入测试它的行为。