测试ruby类方法在另一个gem中调用方法

时间:2016-12-15 11:31:24

标签: ruby rspec rubygems

所以我有一个导入并使用ruby gem的ruby类。 gem是自己测试的,但我想编写一个测试,确保我的类方法在gem上调用正确的方法。

我不确定这是怎么回事。

这是我的班级方法:

  def article_body
    renderer = ArticleBodyRenderer.new
    renderer.to_html(data.fetch(:body))
  end

我希望我的测试检查此方法是否调用:renderer.to_html()

我如何在ruby中执行此操作。我正在使用rspec单元测试。

3 个答案:

答案 0 :(得分:1)

应该是这样的:

let(:renderer) { ArticleBodyRenderer.new }

it 'calls the to_html on rendered' do
  expect(renderer).to receive(:to_html)
  subject.article_body
end

逻辑如下:首先你说你期望某个对象接收一些消息(在这个对象上调用的方法),而不是你触发某些东西,它应该实际对预期的对象执行预期的方法调用。

答案 1 :(得分:1)

您应该将renderer实例提取到自己的方法中:

def renderer
  @renderer ||= ArticleBodyRenderer.new
end

def article_body
  renderer.to_html(data.fetch(:body))
end

这使您可以更轻松地模拟它,例如使用instance double

renderer_double = instance_double('ArticleBodyRenderer')
allow(your_instance).to receive(:renderer).and_return(renderer_double)

expect(renderer_double).to receive(:to_hml).with(...)
your_instance.article_body

或通过spy

renderer_spy = spy('ArticleBodyRenderer')
allow(your_instance).to receive(:renderer).and_return(renderer_spy)

your_instance.article_body
expect(renderer_spy).to have_received(:to_hml).with(...)

答案 2 :(得分:1)

要确保方法中的renderer初始化是存根的,您需要使用"Any instance of" stub。所以:

let(:formatted_text) { '<foo>bar</foo>' }

it 'calls the to_html on rendered' do
  allow_any_instance_of(ArticleBodyRenderer).to receive(:to_html).and_return(formatted_text)
  expect(subject.article_body).to eq(formatted_text)
end