1


1

統合テスト:コントローラーで作成vs新規

編集:提案に従いました。 質問の最後をご覧ください。

2つの機能を備えたコントローラーがあります。

 def new
     if login_required
            @discussion = Discussion.new
            respond_to do |format|
                  format.html # new.html.erb
                  format.xml  { render :xml => @discussion }
            end
      end
 end


 def create
     if login_required
         @discussion = Discussion.new(params[:discussion])
         @discussion.update_attribute("user_id",session[:userid])
         respond_to do |format|
         if @discussion.save
            flash[:notice] = 'Discussion was successfully created.'
            format.html { redirect_to(@discussion) }
            format.xml  { render :xml => @discussion, :status => :created, :location => @Discussion }
        else
            format.html { render :action => "new" }
            format.xml  { render :xml => @discussion.errors, :status => :unprocessable_entity }
        end
   end
 end
end

今、私の統合テストファイルには次のものがあります:

test "test 1" do
   post "/users/login",:user=> { :name => "bob", :password => "test_pass" }
   post "/discussions/create", :discussion => { :title => "title 1", :body => "discussion body", :id => "101"} #Create 1
   assert_response :success       #Assert 1
   get "/discussions/101"
   assert_response :success       #Assert 2
end

ただし、Assert 1で「302」を取得します。

「作成1」を「/ discussions / new」に変更すると、:discussion ⇒ \ { :title ⇒ "title 1", :body ⇒ "discussion body", :id ⇒ "101"}

404エラーが発生します。

{空} 1)何が起こっているのですか?

2)自分でこれを理解するために、どのツール/オプションが利用可能ですか?

ありがとう

更新

次の提案(Ryan Biggから):

  • post:create、\ {:discussion ⇒ \ {}}、\ {:user_id ⇒ users(:bob).id }

結果:

  • Rack :: Lint :: LintError:env変数HTTP_USER_IDに文字列以外の値があります 1976283457

未解決。

2 Answer


2


いくつかのこと:

  1. login_requiredを「before_filter」に移動してみてください。

  2. あなたのテストのためにあなたはやっているべきです post:create、:discussion ⇒ {…​ }. 正しく設定されていれば、テストはコントローラーについて既に知っているはずです。 命名規則は頭の上の「DiscussionsControllerTest」だと思います。

実際にログインしていないため、Assert 1で302を取得しているのはなぜだと思います。 `post`の呼び出しで認証情報を渡してみてください:

post :create, { :discussion => { } }, { :user_id => users(:bob).id }

post`の2番目の引数はparams Hash`で、3番目の引数はセッション `Hash`です。 ユーザーフィクスチャをロードし、bobというキーがある場合、これを見つけてログインに使用する必要があります。

  • RSpec *テストで使用する代替ソリューションは、ログインするユーザーのログインの単一の引数を取る `login_as`メソッドを定義することです。 その後、コントローラーまたは統合テストで行うすべてのリクエストは、そのユーザーとしてログインします。

def login_as(name)
  request.session[:user] = users(name).id
end

`test_helper.rb`ファイルでも同じことができるはずですが、…​ 私は試したことがありません。 YMMV


0


コントローラですべてが正常に機能しているようです。 テストでは、POSTリクエストを送信し、 `new`アクションはPOSTリクエストを受け入れず、GETのみを受け入れます。 `create`アクションはPOSTを受け入れますが、ディスカッションを正常に作成した後にリダイレクトを送信します。

おそらく最初の `assert_response:success`を次のように置き換える必要があります:

assert_redirected_to :controller => "discussions", :action => "show"`