今天我遇到了一个问题,使用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 ... }
我以为我能够在顶部模拟和存根一次。
答案 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 }
虽然我认为你的阻止方法看起来更干净。