Ruby on rails RSpec:测试模型是否接收#使用特定参数创建?

Ruby on rails RSpec:测试模型是否接收#使用特定参数创建?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我刚刚遇到一个edge案例,当时我正在打电话: Model.create(param: derp, param2: derp2, ...) 我路过的一个情人错了 我想测试一个模型是否接收到传入正确参数的调用 我的本能是: expect_any_instance_of(Model).to receive(:create).with(param: derp, param2: derp2, ...) 但这给了: Model does not implement #create 我要传递的大部分内

我刚刚遇到一个edge案例,当时我正在打电话:

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)
有什么想法吗


编辑:谢谢大家…所有3个都是正确的。接受第一个:)这很简单,真不敢相信我错过了。我一开始真的试过了,但突然(!)一下,结果失败了。。。需要执行接收(:创建!)。

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

expect_any_instance_of(Model).to receive(:create).with(param: derp, param2: derp2, ...)
#create
方法的接收者是
模型
,而不是它的任何实例。以下各项应该可以很好地发挥作用:

expect(Model).to receive(:create).with(args ...)
一般来说,您应该避免期望/允许任何实例,因为这通常表明您可以改进设计

我希望这能有所帮助:)

这行不通

期望(Model.)的任何实例接收(:create).with(param:derp,param2:derp2,…

因为
create
不是一个实例方法
#create
,它是一个模型方法
。create

你可以试试

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

Model.count
示例仅确认记录已创建,正如您在评论中所说,无论有效参数如何,都可以创建记录。

您正在调用
expect\u any\u instance\u of(Model)
但create是一个类函数,您可以使用:

expect(Model).to have_received(:create).with(param: derp, param2: derp2, ...)

我假设如果传递了错误的参数,则不会创建模型,并且您希望确保是这样吗?在这种情况下,不会。仍然可以创建模型…不需要正确传递的一个参数(attr_访问器)。这可能对您有用: