我有一个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。