2010-03-02 15 views
1

今天我遇到了使用RoR將呼叫存根到AR對象的問題。我以爲我能夠做到的線沿線的東西:如何讓instance_of在RoR中使用ActiveRecord對象?

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

假設您運行的RSpec> 2.5 ...則模擬/存根語法已得到改進,因此您現在可以使用以下定義。

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

請注意您將需要使用a latter version of RSpec。早期版本的RSpec不包含any_instance方法。看起來他們從Mocha借來了這個,並將它用於RSpec模擬。

如果您使用的是舊版本的RSpec,那麼您認爲是唯一的方法。只是我傾向於這樣寫:

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

儘管我認爲你的塊方法看起來更清潔。

相關問題