3

RSpec を使用して Viewings モデルのコントローラーで create メソッドをテストしています。データベースへの呼び出しを最小限に抑えるためのモック表示モデルを作成し、新しいメソッドと保存メソッドをスタブ化し、適切な値を返して、コントローラーのロジックが機能しているかどうかをテストしようとしています。

describe 'POST #create' do
    let(:office_listing) { create(:office_listing) }
    let(:viewing) { mock_model(Viewing).as_null_object }
····
    before do·
      Viewing.stub(:new).and_return(viewing)
    end

    describe 'with valid attributes' do
      it 'saves the viewing' do·
        Viewing.any_instance.stub(:save).and_return(true)
        viewing.should_receive(:save)
        post :create, office_listing_id: office_listing.id
      end
    end

    describe 'with invalid attributes' do
      it 'fails and renders a failure message' do
        Viewing.any_instance.stub(:save).and_return(false)
        viewing.should_receive(:save)
        post :create, :office_listing_id => office_listing.id
        assigns(:failure_message).should_not be_nil
      end
    end
  end
end

ここに私のコントローラコードがあります:

def create
    @viewing = Viewing.new(params[:viewing])
    @viewing.broker = current_broker
    @viewing.office_listing = params[:office_listing_id]

    p @viewing.save

    if @viewing && @viewing.save == true
      respond_to do |format|
        format.js
        format.html { redirect_to root_path }
      end
    else
      respond_to do |format|
        @failure_message = "Unable to create viewing."
        format.js
        format.html { redirect_to root_path }
      end
    end
  end
end

問題は、現在のテストに応じて true または false を返すように保存をスタブ化したにもかかわらず、常に表示オブジェクトを返すため、スタブ化が機能しておらず、コントローラーが私のオブジェクトを実際のオブジェクトとしてモックし、.save を呼び出すときにデータベース呼び出しを行います。メソッドをスタブ化するには、Viewing 以外のクラスを使用する必要がありますか? Viewing.any_instance ではなく、viewing.stub を呼び出す必要がありますか? 実際には、私自身の質問に答えたかもしれないタイピングだと思いますが、それでもこの問題について誰かの考えを聞きたいです.

4

1 に答える 1