2010-07-07 17 views
2

Je suis en train de préciser dans mes tests RSpec que mon contrôleur doit utiliser current_user.projects.find() au lieu de Project.find() J'utilise le cadre moqueur Mocha et cherchait quelque chose comme ceci:régulateur de force à utiliser current_user avec moqueur

controller.current_user.projects.expects(:find).returns(@project) 

I ont déjà mocké controller.stubs(:current_user).returns(@profile)

Ce test passe avec cela même lorsque j'utilise l'implémentation Project.find(). Comment puis-je tester que mon contrôleur appelle de l'objet correct?

Modifier (ajout de code supplémentaire):

J'ai projets et tâches, projet ont de nombreuses tâches. Ceci est la méthode d'exposition pour afficher une tâche dans un projet qui appartient à current_user

action dans le contrôleur:

def show 
    @project = current_user.projects.find_by_id(params[:cardset_id]) 

    if @project.nil? 
     flash[:notice] = "That project doesn't exist. Try again." 
     redirect_to(projects_path) 
    else 
     @task = @project.tasks.find_by_id(params[:id]) 
    end 
    end 

C'est le test qui ne vérifie pas que la méthode cardsets a été renvoya sur le current_user objet.

test actuel:

context "with get to show" do 
    context "with valid project" do 
    before(:each) do 
     @project = Factory(:project) 
     @task = Factory(:task) 
     @profile = @project.profile 
     ApplicationController.stubs(:require_user).returns(true) 
     controller.stubs(:current_user).returns(@profile) 

     Project.stubs(:find_by_id).returns(@project) 
     @project.tasks.stubs(:find_by_id).returns(@task) 
     get :show, :project_id => @project.id, :id => @task.id 
    end 

    it "should assign task" do 
     assigns[:task].should_not be_nil 
    end 

    it "should assign project" do 
     assigns[:project].should_not be_nil 
    end 
    end 

    context "with invalid project" do 
    before(:each) do 
     Project.stubs(:find_by_id).returns(nil) 
     get :show, :project_id => @project.id, :id => @task.id 
    end 

    it "should set flash" do 
     flash[:notice].should match(/doesn't exist/i) 
    end 

    it "should redirect" do 
     response.should redirect_to(cardsets_url) 
    end 
    end 
end 
+0

donnant plus du code à la fois le test et le contrôleur pourrait aider. il n'est pas clair comment un test pourrait passer si l'attente n'est clairement pas satisfaite. – Pete

Répondre

0

Basé sur le peu que vous nous avez dit, je pense que vous avez besoin:

@profile.expects(:find).returns(@project) 
+0

J'ai mis à jour ma question avec plus de code que j'utilise. – trobrock

+0

Ceci est proche de ce dont j'avais besoin .... '@ profile.cardsets.expects (: find_by_id) .returns (@project)' – trobrock