所以我有一个导入并使用ruby gem的ruby类。 gem是自己测试的,但我想编写一个测试,确保我的类方法在gem上调用正确的方法。
我不确定这是怎么回事。
这是我的班级方法:
def article_body
renderer = ArticleBodyRenderer.new
renderer.to_html(data.fetch(:body))
end
我希望我的测试检查此方法是否调用:renderer.to_html()
我如何在ruby中执行此操作。我正在使用rspec单元测试。
答案 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