2010-04-29 13 views
0

J'essaye d'écrire un test fonctionnel. Mon test se présente comme suit:RSpec: L'attente sur le modèle ne fonctionne pas pendant le test du contrôleur

describe PostsController do 
    it "should create a Post" do 
    Post.should_receive(:new).once 
    post :create, { :post => { :caption => "ThePost", :category => "MyCategory" } } 
    end 
end 

Mon PostsController (une partie en fait) se présente comme suit:

PostController < ActiveRecord::Base 

    def create 
    @post = Post.new(params[:post]) 
    end 

end 

L'exécution du test que je reçois toujours un échec, qui dit que la classe post attendu: nouveau mais jamais eu. Pourtant, le message est créé.

Je suis un débutant à RSpec. Est-ce que je manque quelque chose?

Répondre

0

Vous pouvez utiliser la méthode controller de Rspec-rails pour tester les attentes de message sur les contrôleurs, comme décrit here. Donc, une façon de tester votre create action est comme ceci:

describe PostsController do 
    it "should create a Post" do 
    controller.should_receive(:create).once 
    post :create, { :post => { :caption => "ThePost", :category => "MyCategory" } } 
    end 
end 

EDIT (faire un argument)

Vous pouvez envisager que ce soit une bonne idée d'écrire un test qui dépend de la mise en œuvre de l'action create. Si vous testez quoi que ce soit autre que les responsabilités d'un contrôleur, vous risquez de rompre les tests lors de la refactorisation et d'avoir à revenir en arrière et à réécrire les tests lorsque l'implémentation change.

Le travail de création action est de créer quelque chose - si test que:

Post.count.should == 1

et vous savez si un poste a été créé, sans dépendre de la façon dont il a été créé.

EDIT # 2 (hum ...)

Je vois de votre question initiale que vous connaissez déjà le poste est en cours de création. Je ferais toujours valoir que vous devriez tester le comportement, pas l'implémentation, et que vérifier si le modèle reçoit un message n'est pas une bonne chose dans un test de contrôleur. Peut-être que ce que vous faites est le débogage, pas de test?

+0

Merci, mais ce n'est pas quelque chose que j'essaie d'accomplir. Ce que je veux faire est de vérifier si une classe de modèle a reçu un certain message (comme: find,: create ou plus) – gmile

1

EDIT - jetais les ordures précédent

Cela devrait faire ce que vous voulez

require File.dirname(__FILE__) + '/../spec_helper' 

describe PostsController do 
    it "should create a Post" do 
    attributes = {"Category" => "MyCategory", "caption" => "ThePost"} 
    Post.stub!(:new).and_return(@post = mock_model(Post, :save => false)) 
    Post.should_receive(:new).with(attributes).and_return @post 
    post :create, { :post => attributes } 
    end 
end 

Cela suppose que vous utilisez rspecs moqueur bibliothèque et sont propriétaires que vous avez le joyau de rspec_rails installé.