我刚碰到一个边缘案件,我打电话给:

Model.create(param: derp, param2: derp2, ...)

而我传进来的一个情妇是错的。
我想测试一个模型是否正在接收传入了正确参数的调用。
我的直觉是:
expect_any_instance_of(Model).to receive(:create).with(param: derp, param2: derp2, ...)

但这给了我们:
Model does not implement #create

我传入的大多数内容只是模型属性,我可以测试它们是否正确传入,如下所示:
it "passes the derp into param" do
    expect(Model.first.param).to eq(derp)
end

但是,我传入的一个东西是attr_访问器,模型正在使用after_create回调函数(这实际上是我传入错误的参数,所以出于主体,整个测试都是为了这个)。
我可以像上面那样测试它…查询它,确保after create做了它的事情,这意味着它正确地传入了-但是当我真的只想测试以确保模型在调用create时接收到正确的参数时,不管在回调中之后发生了什么,我都在耦合after create功能。
我在这里肯定很挑剔,但我希望我的单元测试尽可能模块化,而不是依赖其他代码我只想确保当我调用create时,它接收到它应该接收的数据。
我唯一能在rspec文档中找到的是
expect(Model.count).to eq(1)

有什么想法吗?
编辑:谢谢大家…三个都是对的。接受了第一条:)这很简单,真不敢相信我错过了一开始我真的试过了,但是很成功(!)但这导致了它的失败需要进行接收(:create!)是的。

最佳答案

我不确定这是你问题的核心,但这里有一个概念上的错误:

expect_any_instance_of(Model).to receive(:create).with(param: derp, param2: derp2, ...)

#create方法的接收者是classModel,而不是它的任何实例以下操作应该非常有效:
expect(Model).to receive(:create).with(args ...)

作为一般规则,您应该避免期望/允许任何实例,因为它通常表示您可以改进您的设计。
我希望这有帮助:)

关于ruby-on-rails - RSpec:测试模型是否收到带有某些参数的#create?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34745338/

10-13 05:28