2016-07-01 7 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을 테스트해야합니다 : 인스턴스 변수가 I이 클래스가

는 지금까지이 시도 :

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 
: 여기

내가 그것을 테스트해야 참조하는 방법이다

관련 문제

 관련 문제