2

私はRSpecテストで、Mochaモックフレームワークを使用するcurrent_user.projects.find()代わりにコントローラーが使用する必要があることを指定しようとしており、次のようなことを試みていました。Project.find()

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
4

1 に答える 1

0

あなたが私たちに言ったことに基づいて、私はあなたが必要だと思います:

@profile.expects(:find).returns(@project)
于 2010-07-07T00:42:06.250 に答える