2010-03-02 11 views
1

Aujourd'hui, j'ai rencontré un problème en utilisant RoR pour remplacer les appels aux objets AR. Je pensais que je serais capable de faire quelque chose le long des lignes de:Comment faire pour que instance_of fonctionne avec les objets ActiveRecord dans RoR?

stub.instance_of(BankAccount).save_to_other_spot { true } 

Cependant quand j'ai essayé cette méthode, il ne semble pas bouchonner la méthode du tout et finirais en cours d'exécution de la méthode originale I essayait de talonner. Je confirme ce débogueur en utilisant etc.

Je fini par utiliser la méthode suivante:

stub.proxy(BankAccount).find(anything) do |account| 
    stub(account).save_to_other_spot { true } 
    account 
end 

Cela fonctionne.

Je me demandais si je faisais quelque chose de mal? Pourquoi le paramètre instance_of ne fonctionne-t-il pas comme je le souhaite?

Un autre problème que j'ai rencontré, c'est que dans mes tests RSpec, il semble que je devais configurer mes mock et stubs pour chaque requête. Encore une fois, est-ce normal ou est-ce que je fais quelque chose de mal?

Par cela, je veux dire que je devais faire quelque chose comme:

... mock and stub ... 
get :show, :id => @id 

... mock and stub ... 
post :update, :id => id, :account => { ... params ... } 

Je pensais que je serais capable de se moquer de fois et le talon en haut.

Répondre

1

En supposant que vous exécutez RSpec> 2.5 ... alors la syntaxe simulacre/stubbing a été améliorée afin que vous puissiez maintenant utiliser la définition suivante.

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

Notez que vous devrez utiliser a latter version of RSpec. Les versions antérieures de RSpec n'incluent pas la méthode any_instance. On dirait qu'ils l'ont emprunté à Mocha et l'ont implémenté dans des simulacres RSpec.

Si vous utilisez les anciennes versions de RSpec, je pense que ce que vous faites est la seule solution. Seulement que je tends à écrire comme ceci:

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

Je pense que votre Quoique méthode de bloc semble plus propre.