如何在RSpec中模拟新的ActiveRecord对象的create调用?

时间:2016-09-01 15:35:08

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

我有一个ActiveRecord对象用户。在我正在制作的应用程序中,我在gem上使用单个符号,但我需要在数据库中保存一些用户数据。我的ApplicationController有这个代码:

def create_user
  User.create(name: current_user['name'], email: current_user['email'], company_id: current_user['id'])
end

我需要一个RSpec测试来模拟实际的create调用。我试过了

allow_any_instance_of(User).to receive(:create).with(any_args).and_return(user)

返回错误消息“用户未实现创建”。

2 个答案:

答案 0 :(得分:2)

我认为allow_any_instance_of希望User实例能够实现create。但是,create方法。因此,我认为错误消息是User实例没有实现create

我建议查看class_double是否适用于您的用例。查看来自Myron Marston的Rspec Mocksthis SO帖子。

答案 1 :(得分:2)

jvillian是正确的,问题是createUser实现,而不是User的实例。简单的修复只是直接在User上存根(即使用allow而不是allow_any_instance_of):

allow(User).to receive(:create).with(any_args).and_return(user)

此外,.with(any_args)是无操作,因此这是等效的:

allow(User).to receive(:create).and_return(user)