2017-06-16 2 views
1

rspecを使用してブロックが自分の関数で呼び出されているかどうかを確認します。ブロックをチェックする方法はrspecを使用して呼び出されます

SP testing speak functionality can receive a block 
    Failure/Error: block.call() 

    NoMethodError: 
     undefined method `call' for nil:NilClass 
    # ./test.rb:9:in `speak' 
    # ./test.rb:25:in `block (2 levels) in <top (required)>' 

はあなたが助けてくださいでした:

class SP 
    def speak(options={},&block) 
    puts "speak called" 
    block.call() 
    rescue ZeroDivisionError => e 
    end 
end 




describe SP do 
it "testing speak functionality can receive a block" do 
    sp = SP.new 
    def test_func 
     a = 1 
    end 
    sp_mock = double(sp) 
    expect(sp_mock).to receive(:speak).with(test_func) 
    sp.speak(test_func) 
end 
end 

以下は私の誤りである:以下は私のコードです。私はそれに多くの時間を費やしました。

答えて

3

あなたはRSpecののyield matcherのいずれかを使用する必要があります。

describe SP do 
    it "testing speak functionality can receive a block" do 
    sp = SP.new 
    expect { |b| sp.speak(&b) }.to yield_control 
    end 
end 
2

私はステファンが最良の答えを提供すると思います。しかし、実装の詳細の代わりにコードの動作をテストする必要があることを指摘したいと思います。

describe SP do 
    it "testing speak functionality can receive a block" do 
    sp = SP.new 
    called = false 
    test_func = ->() { called = true } 

    sp.speak(&test_func) 

    expect(called).to eql(true) 
    end 
end 
+0

これは、「yield_control」の機能ですね。 – Stefan

+0

@Stefan実際にテストする内容によって異なります。この場合、 '.yield_with_no_args'が最も具体的なテストになります。しかし、 'SP#speak'は渡されたブロックによって異なる動作をするので、それらのケースもカバーする必要があります。テスト設定では、渡されたブロックは 'ZeroDivisionError'を発生させる必要があります。 –

関連する問題