0

私は次のテストを書いています:

    let!(:city_areas) { FactoryGirl.create_list(:city_area, 30) }

    before {
        @city_areas = mock_model(CityArea)
        CityArea.should_receive(:where).and_return(city_areas)
    }

    it 'should assign the proper value to city areas variable' do
        get :get_edit_and_update_vars
        assigns(:city_areas).should eq(city_areas.order("name ASC"))
    end

次のメソッドをテストします。

def get_edit_and_update_vars
    @city_areas = CityArea.where("city_id = '#{@bar.city_id}'").order("name ASC").all
end  

ただし、nil:NilClass のメソッド「city_id」がないと言って失敗し、インスタンス変数 @bar をまだ使用しようとしていると思われます。

これを防ぐために、この where ステートメントを適切にスタブするにはどうすればよいですか?

4

1 に答える 1

1

@city_areas = mock_model(CityArea) を実行しているのに、二度と @city_areas を使用しないのはなぜですか?

私はこのようにテストします:

モデル CityArea 内で、このための名前付きスコープを作成します: where("city_id = '#{@bar.city_id}'").order("name ASC")

次に、コントローラー仕様で行います

describe 'GET get_edit_and_update_vars' do
  before(:each) do
    @areas = mock('areas')
  end

  it 'gets the areas' do
    CityArea.should_receive(:your_scope).once.and_return(@areas)
    get :get_edit_and_update_vars
  end

  it 'assign the proper value to city areas variable' do
    CityArea.stub!(:your_scope => @areas)
    get :get_edit_and_update_vars
    assigns(:city_areas).should eq(ordered)
  end
end

また、モデル スペックでその新しいスコープのスペックを作成する必要があります。

ヒントとして、before ブロック内で should_receive(...) を使用しないでください。スタブを使用してください。メソッドが呼び出されたことをテストする場合は、 before 内で should_receive を使用します

また、コントローラーをテストするときに factorygirl を使用する必要はありません。常にモデルをモックする必要があります。モデルはモデル仕様でテストできます。

于 2012-10-16T02:44:16.610 に答える