2014-02-12 47 views
1

我有一些代碼(爲了本示例的目的,我已經將其剝離),並且正在尋找一些有關使用RSpec測試它的最佳方法的建議。使用RSpec測試一個塊

ActionController::Renderers.add :liquid do |obj, options| 
    # Set the mime type as HTML. 
    self.content_type ||= Mime::HTML 

    # Do some clever stuff.... 

    # Render the liquid layout. 
    self.response_body = layout.render(obj) 
end 

該塊通過add()調用添加到一個集合中,並在稍後執行。

我正在測試塊的功能,以確保它做我想要的一切,比如設置正確的變量(self.content_type)並調用正確的庫(layout.render)。

我從來沒有測試過這樣的塊的內容,所以尋找一些友好的建議,如何最好地去做,我可以按原樣測試塊,還是需要重構到外部方法,可以被測試?

+0

你應該寧願做是測試模塊提供的效果。在控制器測試中,發送請求並聲明返回的響應已正確呈現。您不想將測試緊密地與實施結合。 – DiegoSalazar

回答

1

您可以刪除添加的Renderer,並從代碼中測試塊的調用。在下面的代碼我假設你給片段是一個名爲register_liquid方法中:

let(:obj) { double(:obj) } 
let(:options) { double(:options) } 

before do 
    allow(ActionController::Renderers).to receive(:add).with(:liquid).and_yield(obj, options) 
end 

it 'sets content type' do 
    expect(subject).to receive(:content_type=).with(Mime::HTML) 

    subject.register_liquid 
end