2011-08-17 47 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)