2012-02-07 15 views
9

私はRspecを使用しようと考えました。しかし、assert_selectの次の問題が発生します。Rails 3 RSpecとassert_select

1) UserController login page open login page contains all expected controls 
Failure/Error: assert_select "form[action=?]", "/user/login" do MiniTest::Assertion: 
Expected at least 1 element matching "form[action='/user/login']", found 0. 
# (eval):2:in `assert' 
# ./spec/controllers/user_controller_spec.rb:20:in `block (3 levels) in <top (required)>' 

これは私のコードでは、私は、ブラウザでログインページを開くと、このページが問題なく開く

describe UserController do 
    describe "login page open" do 
    it "login page contains all expected controls" do 
     get :login 
     assert_select "form[action=?]", "/user/login" do 
     assert_select "input[name=?]", "username" 
     assert_select "input[name=?]", "password" 
     assert_select "input[type=?]", "submit" 
    end 
    end 
end 

スニペット。

+0

RSpecを使用すると、なぜMiniTest :: Assertionエラーが出ますか?私はあなたのRSpecセットアップに何か間違っていると思います! – phoet

+0

私も思う。しかし、私はこれですべてをしました[指示](http://rubydoc.info/gems/rspec-rails/frames) – starter

+0

あなたの 'spec/spec_helper.rb'の外観はどうですか?あなたは 'rspec'コマンドで仕様を走らせてみましたか? – phoet

答えて

15

デフォルトでは、RSpec(少なくとも新しいバージョンでは)は、コントローラスペックスペックを実行したときにRailsがビューをレンダリングできないようにします。彼らはあなたがビュースペックであなたのビューをテストするために、コントローラの仕様ではないと思う。ビューはレンダリングされないので、assert_selectは常に失敗します。

しかし(私のような)自分のコントローラー仕様のビューの時折のスニペットをテストしたい人は、render_viewsメソッドを提供します。あなたはブロックの中ではなく、あなたのdescribeまたはcontextブロックでそれを呼び出さなければなりません。

describe UserController do 

    render_views  # <== ADD THIS 

    describe "login page open" do 
    it "login page contains all expected controls" do 
     get :login 
     assert_select "form[action=?]", "/user/login" do 
     assert_select "input[name=?]", "username" 
     assert_select "input[name=?]", "password" 
     assert_select "input[type=?]", "submit" 
    end 
    end 
end 
1

コントローラテストはコントローラをテストするためのテストです。

assert_selectは、あなたのビューコード内にあるものと一致します。

コントローラをビューから切り離しておくことをお勧めします。これにはコントローラとビューで行われたテストが含まれます。あなたのコントローラテストではなく、assert_selectビューテスト(通常はspec/viewsにあるもの)を使用する必要があります。