2016-12-15 8 views
0

私はルビーの宝石を輸入して使用するルビークラスを持っています。この宝石は独自にテストされていますが、クラスメソッドが宝石の正しいメソッドを呼び出すことを確認するテストを作成したいと思います。test ruby​​ classメソッドは別の宝石のメソッドを呼び出します

どのように動作するのかわかりません。ここで

は私のクラスのメソッドです:

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

私は私のテストは、このメソッドが呼び出されますことを確認したい:renderer.to_html()

を私はルビーでこれを行うだろうか。私はrspec単体テストを使用しています。

答えて

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 
+0

ありがとう、これはテストをパスします! – chinds

1

は、これらの線に沿って何かであるべき:

let(:renderer) { ArticleBodyRenderer.new } 

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

次のように論理がある:最初にあなたは、いくつかのオブジェクトが(メソッドは、このオブジェクトで呼び出されている)、いくつかのメッセージを受け取ることを期待していること、そしてあなたが何かをトリガーよりも言います予想されるオブジェクトに対して期待されるメソッド呼び出しを実際に実行するはずです。

+0

ダムは本当に簡単ですか?病気は今これを試してください。コメントありがとう。 – chinds

+0

この行は 'subject.article_body'のためのものです – chinds

+0

@chindsなので、ロジックは次のようになります:まず、何らかのオブジェクトが(このオブジェクトに対して呼び出された)メッセージを受け取ると予想し、予想されるオブジェクトに対して期待されるメソッド呼び出しを実際に実行するはずです。 –

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(...) 
+0

本当にありがとう! instance_doubleを使用した例は素晴らしいです – chinds