2011-08-17 26 views
3

我想寫一些規格,並希望將調用存入數據庫,所以我不依賴實際填充的數據庫來運行測試。如何將DataMapper關聯到RSpec2?

現在我真的不知道如何在使用DataMapper的關聯之間存根調用。

這裏有兩個例子型號:

class Foo 
    include DataMapper::Resource 

    property :id, Serial 

    has n, :bars 
end 

class Bar 
    include DataMapper::Resource 

    property :id, Serial 

    belongs_to :foo 
end 

現在我想用Foo.stub(:first) { #etc }沒有問題存根調用Foo.first('foobar')Foo.first('foobar').bars 第一個,但我不知道如何存根第二個呼叫其協會。 類似Foo.stub(:bars) { #etc }不起作用。

有誰知道該怎麼做?這種方法是否正確?

在此先感謝。

回答

2

我會用一個mock_model。

foo = mock(Foo).as_null_object 
foo.stub(:bars) 
Foo.stub(:first).and_return(foo) 

的原因as_null_object是RSpec的將默認當被問及如果respends到它並沒有被告知要期待一個方法返回false。

如果這不起作用,那麼創建一個foo的實例。

foo = Foo.create(:example => "data") #Or create with a factory a factory 
foo.stub(:bars) 
Foo.stub(:first).and_return(foo) 

然後,當你這樣做:

Foo.first('foobar').bars 

它將使用存根上線2作爲第一次調用返回的foo該實例。

0

沒有測試,但它應該工作:

Foo.stub(:first) { ... } 
foo = Foo.first('foobar') 
foo.stub(:bars) { ... } 

問候,

A.

0

您可以使用stub_chain方法:

Foo.stub_chain(:first, :bars).and_return(:whatever)