2010-07-12 31 views
3

j'ai cet exemple:attente Mocha sur l'association construire appel ne

# GET New 
context "on get to new" do 
    it "should assign cardset" do 
    @profile.cardsets.expects(:build).once.returns(Factory.stub(:cardset)) 
    get :new 
    assigns[:cardset].should_not be_nil 
    end 
end 

Pour tester cette méthode:

# GET /cardsets/new 
def new 
    @cardset = current_user.cardsets.build 
end 

Je suis en train de faire respecter que l'association est construite à partir current_user pour vous assurer que la l'utilisateur ne crée que des choses qui lui appartiennent. J'utilise une attente très semblable pour veiller à ce qu'ils appellent find de l'objet current_user et il fonctionne trouver, mais lorsque vous exécutez l'exemple ci-dessus, je reçois:

6) 
Mocha::ExpectationError in 'CardsetsController for a logged in user on get to new should assign cardset' 
not all expectations were satisfied 
unsatisfied expectations: 
- expected exactly once, not yet invoked: [#<Cardset:0x102eaa8c8>, #<Cardset:0x102e12438>].build(any_parameters) 
satisfied expectations: 
- allowed any number of times, not yet invoked: ApplicationController.require_user(any_parameters) 
- allowed any number of times, already invoked twice: #<CardsetsController:0x1030849c8>.current_user(any_parameters) 

/Applications/MAMP/htdocs/my_app/spec/controllers/cardsets_controller_spec.rb:32: 
+0

Je pense que @profile de votre test n'est pas le même objet que current_user dans votre contrôleur. Pourriez-vous nous montrer le code utilisé pour définir @profile? – robertokl

+0

'@profile = @ cardset.profile' et' controller.stubs (: current_user) .returns (@profile) 'dans un appel' before (: each) 'dans le test. Comme je l'ai dit, j'ai une autre attente similaire qui s'attend à ce que 'find' soit annulé de' current_user' et c'est exactement ainsi que je gère ce cas qui passe. – trobrock

+0

Quelque chose de nouveau qui devrait être mentionné, j'ai juste essayé d'écrire un test avec ce '@ profile.cardsets.expects (: find) .once.returns (@cardset)' qui est exactement le même que mon espérance 'find_by_id' et ce doesn ne fonctionne pas, donc il semble que cela ne fonctionne qu'avec les méthodes de recherche dynamique fournies. – trobrock

Répondre

1

Vous ajoutez l'attente à @profile après vous » ve stubbed la fonction qui le renvoie de current_user. Voici probablement ce que vous devez faire:

# GET New 
context "on get to new" do 
    it "should assign cardset" do 
    @profile.cardsets.expects(:build).once.returns(Factory.stub(:cardset)) 
    controller.stubs(:current_user).returns(@profile) 
    get :new 
    assigns[:cardset].should_not be_nil 
    end 
end