如何使用instance_spy来调试单元测试

时间:2015-09-23 20:09:37

标签: ruby-on-rails unit-testing rspec

我进行了以下单元测试,我试图调试:

describe "#issue!" do
  it "delegates to task#issue" do
    t = instance_spy("Task")
    expect(t).to receive(:issue).with(type: 'create_task')
  end
end

它击中的方法来自于此:

def issue!
  t = object.tasks.new
  t.issue(type: 'create_task')
  t
end

当我运行rspec时,我收到以下消息:

  

失败/错误:期望(t)。接收(:问题).with(类型:' create_task')         (InstanceDouble(Task)(匿名))。issue({:type =>" create_task"})             预期:1次参数:({:type =>" create_task"})             收到:0次

基本上,我想知道instance_spy是如何工作的?它是否创建了一个绕过验证而不将其保存到数据库的新对象,类似于使用.new,还是将其保存到数据库而不进行验证(.create!(validate:false))?一直试图解决这个错误一段时间。

1 个答案:

答案 0 :(得分:2)

在您的规范中,您永远不会在调用expect的{​​{1}}之后调用任何内容。请记住,在规范之后,任何间谍和嘲笑都将被卸载。

除此之外,issue!创建一个类似于指定类的新虚拟对象,因为可以在其上调用原始类的实例上存在的相同方法。

它被称为verifying double,并在documentation of rspec-mocks中有记录。