我进行了以下单元测试,我试图调试:
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))?一直试图解决这个错误一段时间。
答案 0 :(得分:2)
在您的规范中,您永远不会在调用expect
的{{1}}之后调用任何内容。请记住,在规范之后,任何间谍和嘲笑都将被卸载。
除此之外,issue!
创建一个类似于指定类的新虚拟对象,因为可以在其上调用原始类的实例上存在的相同方法。
它被称为verifying double,并在documentation of rspec-mocks
中有记录。