1

私はコトローラーのテストを書いていますが、成功していません。私のテストは:

describe VideosController do
  describe 'index' do
    it 'should select the index template for rendering' do
      Video.stub(:video_exists?).with("KgfdlZuVz7I").and_return(true)
      get :index, { :q => "KgfdlZuVz7I" }
      response.should render_template('index')
    end
  end
end

これがコントローラーです。

class VideosController < ApplicationController
  def index
    if params[:q]
      params_hash = CGI::parse(params[:q])
      if Video.video_exists?(params_hash.values[0][0])
        video = Video.new :video_id => params_hash.values[0][0]
        if video.save!
          flash[:notification] = "Video found."
        else
          flash[:notification] = "Video found but not saved to database."
        end
        redirect_to root_path  
      else
        flash[:notification] = "Video not found."
        redirect_to root_path
      end
    end
  end
end

テストに合格せず、次のメッセージが表示されます。

VideosControllerインデックスは、レンダリングの失敗/エラーのインデックステンプレートを選択する必要があります:get:index、{:q => "KgfdlZuVz7I"} receive:video_exists?予期しない引数が予想されます:( "KgfdlZuVz7I")got :(引数なし)メッセージが他の引数でも受信される可能性がある場合は、最初にデフォルト値をスタブしてください。#。/ app / controllers / videos_controller.rb :5:inindex' # ./spec/controllers/videos_controller_spec.rb:12:inブロック(3レベル)in '

video_existsだけをスタブしたので、ビデオを正しい方法でスタブしていないと思いますか?しかし、新しくはなく、保存します。しかし、私はTDDとRspecを初めて使用するため、これを解決する方法がわかりません。

4

1 に答える 1

3

アドバイス #1 として、テストで行ったように「ランダムな文字列」を 2 回書き出すべきではありません。これはミスタイプが非常に起こりやすく、視覚的に確認するのが非常に困難です。代わりにこれを使用してください:

rnd_id = "KgfdlZuVz7I"
Video.stub(:video_exists?).with(rnd_id).and_return(true)
get :index, { :q => rnd_id }

また、私は何params_hash = CGI::parse(params[:q])をすべきかわかりません。通常のようにパラメーターを使用しないのはなぜですか?

class VideosController < ApplicationController
  def index
    if params[:q]
      if Video.video_exists?(params[:q])
        video = Video.new :video_id => params[:q]
        if video.save!
          flash[:notification] = "Video found."
        else
          flash[:notification] = "Video found but not saved to database."
        end
        redirect_to root_path  
      else
        flash[:notification] = "Video not found."
        redirect_to root_path
      end
    end
  end
end
于 2012-09-18T16:34:18.020 に答える