2011-08-17 4 views
3

J'essaie d'écrire certaines spécifications et je veux remplacer les appels à la base de données afin que je ne compte pas sur une base de données remplie réelle pour faire fonctionner les tests.Comment remplacer une association DataMapper avec RSpec2?

Maintenant, je ne sais pas vraiment comment remplacer les appels entre les associations à l'aide de DataMapper.

Voici deux modèles par exemple:

class Foo 
    include DataMapper::Resource 

    property :id, Serial 

    has n, :bars 
end 

class Bar 
    include DataMapper::Resource 

    property :id, Serial 

    belongs_to :foo 
end 

Maintenant, je veux bouchonner l'appel à Foo.first('foobar') et Foo.first('foobar').bars Le premier est aucun problème en utilisant Foo.stub(:first) { #etc } mais je ne sais pas comment stub le deuxième appel à ses associations. Quelque chose comme Foo.stub(:bars) { #etc } ne fonctionne pas.

Est-ce que quelqu'un sait comment le faire? Cette approche est-elle correcte?

Merci d'avance.

Répondre

2

J'utiliser un mock_model.

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

La raison de la as_null_object est que RSpec retourne false par défaut lorsqu'on lui a demandé si elle respends à une méthode qui n'a pas été dit d'attendre.

Si cela ne fonctionne pas, créez une instance de foo.

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

Puis, quand vous faites:

Foo.first('foobar').bars 

il utilisera le talon sur la ligne 2 que le premier appel renverra cette instance de foo.

0

pas testé, mais il devrait fonctionner:

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

salutations,

A.

0

Vous pouvez utiliser la méthode stub_chain:

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