如何模拟创建调用一个新的ActiveRecord对象在RSpec



我有一个ActiveRecord对象User。在应用程序中,我正在使用一个单一的标志在宝石,但我需要保存一些用户数据在我们的数据库。我的ApplicationController有这样的代码:

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

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

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

返回错误"User does not implementation create"

jvillian是正确的,问题是create是由User实现的,而不是由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)

我认为allow_any_instance_of期待User实例来实现create。然而,create是一个方法。所以,我相信错误消息说User实例不实现create

我建议看看class_double是否适用于你的用例。查看Rspec Mocks和Myron Marston的SO post。

最新更新