Заставить контроллер использовать current_user с насмешкой - PullRequest
2 голосов
/ 07 июля 2010

Я пытаюсь указать в моих тестах RSpec, что мой контроллер должен использовать current_user.projects.find() вместо Project.find() Я использую фреймворк Mocha и пытался что-то вроде этого:

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

Я уже вычеркнул controller.stubs(:current_user).returns(@profile)

Этот тест проходит с этим, даже когда я использую реализацию Project.find(). Как я могу проверить, что мой контроллер вызывает правильный объект?

Редактировать (добавить дополнительный код):

У меня есть Проекты и Задачи, у Проекта много задач. Это метод show для отображения задачи в проекте, который принадлежит current_user

Действие в контроллере:

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

Это тест, который не проверяет, был ли вызван метод cardsets для объекта current_user.

Текущий тест:

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

1 Ответ

0 голосов
/ 07 июля 2010

Исходя из всего, что вы нам сказали, я думаю, вам нужно:

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