如何让instance_of与RoR中的ActiveRecord对象一起使用?

时间:2010-03-02 08:59:17

标签: ruby-on-rails ruby testing rspec integration-testing

今天我遇到了一个问题,使用RoR来存根调用AR对象。我以为我能够按照以下方式做点什么:

stub.instance_of(BankAccount).save_to_other_spot { true }

然而,当我尝试这种方法时,似乎根本没有存根该方法,它最终会运行我试图存根的原始方法。我使用调试器等确认了这一点。

所以我最终使用了以下方法:

stub.proxy(BankAccount).find(anything) do |account|
  stub(account).save_to_other_spot { true }
  account
end

这很有效。

我想知道我是否做错了什么?为什么instance_of不像我期望的那样工作?

我遇到的另一个问题是,在我的RSpec测试中,我似乎必须为每个请求设置我的模拟和存根。再次,这是正常还是我做错了什么?

我的意思是,我必须做类似的事情:

... mock and stub ...
get :show, :id => @id

... mock and stub ...
post :update, :id => id, :account => { ... params ... }

我以为我能够在顶部模拟和存根一次。

1 个答案:

答案 0 :(得分:1)

假设您正在运行RSpec> 2.5 ...那么模拟/存根语法已得到改进,现在您可以使用以下定义。

BankAccount.any_instance.stub(:save_to_other_spot) { true }

请注意,您需要使用a latter version of RSpec。早期版本的RSpec不包含any_instance方法。看起来他们是从摩卡那里借来的,并将其实施到RSpec模拟中。

如果您使用的是较早版本的RSpec,那么我认为您正在做的是唯一的方法。只有我倾向于这样写:

@bank_account = BankAccount.new
BankAccount.stub(:find) { @bank_account }
@bank_account.stub(:save_to_other_spot) { true }

虽然我认为你的阻止方法看起来更干净。