Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby RSpec:允许实例变量接收方法_Ruby_Rspec - Fatal编程技术网

Ruby RSpec:允许实例变量接收方法

Ruby RSpec:允许实例变量接收方法,ruby,rspec,Ruby,Rspec,假设我有这门课: 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

假设我有这门课:

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
类,但您没有指定允许它接收
#push
,这就是为什么它在
myu queue.push(消息行)
行失败的原因

事实上,你走错了方向。您想测试
MyQueue
类的方法,该类使用
Queue
实例。您要做的是存根与
队列
交互相关的所有内容,但是您可以模拟
MyQueue
实例(
myu Queue
),使其成为虚拟的(因此,对其进行所有调用,包括要测试的
推送

以下是我认为应该对其进行测试的方式:

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