45
class TestController < AplicationController
  #....

  private

  def some_method
    unless @my_variable.nil?
      #...
      return true
    end
  end
end

some_methodコントローラーの仕様で直接テストしたい:

require 'spec_helper'

describe TestController do
  it "test some_method"
    phone = Phone.new(...)
    controller.assign(:my_variable,phone) #does not work
    controller.send(:some_method).should be_true
  end
end

コントローラーの仕様からTestControllerインスタンス変数を設定するにはどうすればよいですか?@my_variable

4

3 に答える 3

71

コントローラーでプライベート メソッドをテストするときは、 を使用するのではなく、プライベート メソッドを直接呼び出したくないため、匿名コントローラーsendを使用する傾向がありますが、プライベート メソッドへのインターフェイスを呼び出します (または、以下のテストでは、そのインターフェイスを効果的にスタブ化します)。したがって、あなたの場合、おそらく次のようなものです:

require 'spec_helper'

describe TestController do
  controller do
    def test_some_method
      some_method
    end
  end

  describe "a phone test with some_method" do

    subject { controller.test_some_method }

    context "when my_variable is not nil" do
      before { controller.instance_variable_set(:@my_variable, Phone.new(...)) }
      it { should be_true }
    end

    context "when my_variable is nil" do
      before { controller.instance_variable_set(:@my_variable, nil) } 
      it { should_not be_true } # or should be_false or whatever
    end     
  end
end

この StackOverflow Q&Aでは、プライベート メソッドを直接テストする問題についていくつかの良い議論があり、匿名コントローラーを使用する方向に私を動かしましたが、あなたの意見は異なる場合があります。

于 2013-04-15T00:31:40.350 に答える
2

仕様は動作をテストする必要があるため、仕様コントローラーからインスタンス変数にアクセスしたくないと思いますが、いつでもプライベートメソッドをスタブできます。あなたの場合、それは次のようなものでなければなりません(この例ではあまり意味がありません):

describe TestController do
  it "test some_method"
    phone = Phone.new(...)
    controller.stub(:some_method).and_return(true)
    controller.send(:some_method).should be_true
  end
end

これが探しているものでない場合は、これを見てください:メソッド テスト内で使用されるプライベート インスタンス変数を設定する方法は?

于 2013-04-15T00:05:46.880 に答える