假设我有这样一个类:
class MyQueue
def initialize
@queue = Queue.new
end
def push(line)
@queue.push(line)
end
end
当我在MyQueue实例上调用push时,我该如何测试实例变量@queue将接收push方法?
我试过了:
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">)
我做错了什么?
您正在创建MyQueue
类的double,但您没有指定允许接收#push
,这就是为什么它在my_queue.push(message_line)
行上失败的原因。
MyQueue
类的一个方法,该方法使用Queue
实例。您想要做的是存根与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