2012-04-30 18 views
2

現時点では、私のアプリケーションで何が起こっているのかを実際に調べようとしています。私は、ユーザがサインアップ(OAuthかどうか)に使用した方法に応じて、「プロフィールの編集」ページに異なるコンテンツを表示できるようにしようとしています。RSpecはページ上の要素に誤検出を投げます

これは、ユーザーモデルにOAuth属性を追加してテストするだけで、ブラウザで手動でテストするときに正しく機能するようになっています。

しかし、RSpecではこれを正しくテストすることができません。実際、私がどの要素をページ上で探すかを問わず、実際にそこに存在すると主張します。私のRSpecの統合テストのための

describe "edit user" do 

    let(:user) { FactoryGirl.create(:user) } 
    before { sign_in user } 

    describe "correct edit account options shown to normal users" do 
    before do 
     visit edit_user_registration_path(:user) 
    end 

    it { should have_selector('h2',  text: 'Edit User') } 
    it { should have_selector('input', id: 'user_names')} 
    it { should have_selector('input', id: 'user_email', value: user.email) } 
    it { should have_selector('input', id: 'user_password') } 
    it { should have_selector('input', id: 'user_password_confirmation') } 
    it { should have_selector('input', id: 'user_current_password') } 
    it { should have_selector('input', type: 'submit') } 
    end 

    describe "correct edit account options shown to oauth users" do 

    before do 
     user.update_attributes!(:oauth => true) 
     visit edit_user_registration_path(:user) 
    end 

    it { should have_selector('h2',   text: 'Edit User') } 
    it { should have_selector('input',  id: 'user_names')} 
    it { should_not have_selector('input', id: 'user_email') } 
    it { should_not have_selector('input', id: 'users_password') } 
    it { should_not have_selector('input', id: 'users_password_confirmation') } 
    it { should_not have_selector('input', id: 'user_current_password') } 
    it { should have_selector('input',  type: 'submit') } 
    end 
end 

完全なコードはここにある:https://gist.github.com/2556055

このため任意の助けを心からいただければ幸いです。

+0

は、すみません、私はhave_selectorは、彼らが実際に存在しない場合でも、あなたがページ上の任意の要素を持っていることを報告していることを正しく理解していますか? – Flexoid

+0

パスヘルパー関数は ':user'ではなく' user'で呼び出さなければなりません。 – zetetic

答えて

2

理由は、(それはIDが何であったかは違いを行っていない理由はそのため)have_selectorは、複数の引数を取らないということである#rubyonrailsでみんなからこれを解決するに

を手に持っていたのに十分なラッキー。その結果、代わりにhave_cssメソッドに置き換える必要があります。

だから、正しい実装は次のようになります。

describe "edit user" do 
let(:user) { FactoryGirl.create(:user) } 
before { sign_in user } 

describe "correct edit account options shown to normal users" do 
before do 
    visit edit_user_registration_path(:user) 
end 
it { should have_selector('h2',  text: 'Edit User') } 
it { should have_css('input#user_name')} 
it { should have_css('input#user_email') } 
it { should have_css('input#user_password') } 
it { should have_css('input#user_password_confirmation') } 
it { should have_css('input#user_current_password') } 
it { should have_selector('input', type: 'submit') } 
end 

describe "correct edit account options shown to oauth users" do 

before do 
    user.update_attributes!(:oauth => true) 
    visit edit_user_registration_path(:user) 

end 

    it { should have_selector('h2', text: 'Edit User') } 
    it { should have_css('input#user_name')} 
    it { should_not have_css('input#user_email') } 
    it { should_not have_css('input#users_password') } 
    it { should_not have_css('input#users_password_confirmation') } 
    it { should_not have_css('input#user_current_password') } 
    it { should have_selector('input', type: 'submit') } 
end 
end 
+1

あなたはhave_selectorが複数の引数を取っていないと言っていますが、まだhave_selector( 'input'、タイプ: 'submit')の2番目の引数を使ってtype属性を指定しています。 – MattSlay

関連する問題