2016-07-01 2 views
1

は言う方法を受け取ることを許可しますか?RSpecの:</p> <pre><code>class MyQueue def initialize @queue = Queue.new end def push(line) @queue.push(line) end end </code></pre> <p>がどのように私はMYQUEUEインスタンス上のプッシュのために呼び出したときにプッシュ方式を受け取ることになります、そのインスタンス変数@queueをテストする必要があります:インスタンス変数は、私はこのクラスを持っている

私はこれまでのところ、これを試してみました:

describe MyQueue do 
    let(:my_queue) { instance_double('MyQueue') } 
    let(:message_line) { double('message_line') } 

    describe '#push' do 
    before do 
     instance_queue = my_queue.instance_variable_set(:@queue, double) 
     allow(instance_queue).to receive(:push) { message_line } 
    end 

    it 'adds line to the queue' do 
     expect(my_queue.instance_variable_get(:@queue)).to receive(:push) { message_line } 
     my_queue.push(message_line) 
    end 
    end 
end 

しかし、エラーばかり:私が間違って何を

#<InstanceDouble(MyQueue) (anonymous)> received unexpected message :push 
with (#<Double "message_line">) 

やっていますか?

答えて

2

MyQueueクラスの倍数を作成していますが、#pushを受け取れると指定していないため、my_queue.push(message_line)行で失敗します。

実際、あなたは間違った方向に行きます。 Queueインスタンスを使用するMyQueueクラスのメソッドをテストするとします。あなたがしたいのは、Queueとの対話に関連するすべてのものをスタブすることですが、代わりにMyQueueインスタンス(my_queue)をダミーにしてください(それでダミーをテストしたい、#pushを含む)。

describe MyQueue do 
    let(:queue) { instance_double('Queue') } 
    let(:message_line) { double('message_line') } 

    describe '#push' do 
    before do 
     allow(Queue).to receive(:new).and_return(queue) 
     allow(queue).to receive(:push).with(message_line) 
    end 

    it 'adds line to the queue' do 
     expect(queue).to receive(:push).with(message_line) 
     MyQueue.new.push(message_line) 
    end 
    end 
end 

Finished in 0.00575 seconds (files took 0.27625 seconds to load) 
1 example, 0 failures 
:ここ

は、私はそれをテストする必要があります見る方法です。

関連する問題

 関連する問題