1

アプリケーションのテストと開発に(gem rspec-railsを介して)RSpecを使用しています。私はコントローラーを「テスト」して、postメソッドとgetメソッドの奇妙な動作に立ち向かおうとしました(この種の他のすべてのメソッドでも同じです)。

私のルートファイル:

controller :sessions do
    post '/login',  action: :login_create
    get  '/login',  action: :login
    get  '/logout', action: :logout
end

当初、postは指定されたURLでのhttp postリクエストをシミュレートすると考えていたので、仕様に次のように記述しました。

describe "POST 'login'" do
    it "returns http success" do
        post 'login'
        response.should be_success
        response.should render_template 'sessions/login_create'
    end
end

ただし、これにより、login_createではなくログインアクションが呼び出され、最後のアサートが失敗します。たくさんのグーグルと実験の後、私は変わっpost 'login'post :login_create、これは実際に機能します!不思議なことに、私がで変更postしてもget、それは機能し続けます!O_oこれは奇妙ではないですか?このメソッドはどのように機能し、使用されることを目的としていますか?

Rails APIで、クラス以外のものは見つかりませんでした。ActionController::TestCase::Behavior

4

1 に答える 1

1

あなたが書いているのはリクエストスペックではなくコントローラースペックです。コントローラー仕様では、ルートはまったく参照されません。これは、rspec がコントローラー アクションを直接呼び出すためです。

を記述する場合post 'login'loginは URL パスではなく、アクション名を指定します。

login_createアクションをテストする正しい方法は、post :login_create発見したとおりに使用することです。

于 2012-09-04T17:38:55.947 に答える