2012-04-06 10 views
0

私はこのようになり、要求仕様があります。このリクエスト仕様書を書く良い方法は?

describe "Registering from the main page" do 
    before(:each) do 
    fill_in "username","my_username" 
    fill_in "password","my_password" 
    fill_in "password_confirmation","my_password" 
    click_button "Register" 
    end 

    it "should have created a new user" do 
    User.count.should == 1 
    end 

    it "should have changed the message on the homepage" do 
    find("#element").value.should == "You registered!" 
    end 

    # ... other tests like this 
end 

最初の質問を、どのように私は私がフォームを送信する前に0のユーザーを持っていることを確認することができますか?

第2に、beforeは、それが仕事をしても、私には正しそうに見えません。このユースケース全体を登録するためのテストを書くもう1つの方法はありますか?おそらく、何らかの形で前の部分を再構成するか、それとも私がそれをやっているように受け入れられますか?

更新:テストが失敗し始めたため、before(:all)before(:each)に変更しました。 before(:all)を使用しているとき、応答の本文が不完全であるようです。なぜあなたは知っていますか?カウントが事前に何であるかを心配する必要がないように、

答えて

1

あなたはchange()マッチャーを使用することができますすることができます

lambda { click_button("Register") }.should change{ User.count }.by(1) 

あなたは本当にそれが特異的0から1に行きたい場合は、これを行うことができます:

lambda { click_button("Register") }.should change{ User.count }.from(0).to(1) 

before(:all)before(:each)についての質問に答えるために、before(:each)はのに対し、各例(itブロック)の前に一度だけ呼び出されますはdescribeブロック内のすべての例の前に一度だけと呼び出されます。このため、before(:all)はお勧めしません。例のいずれかが初期状態について何かを変更した場合、後の例が影響を受けるからです。あなたはまた、

expect { click_button "Register" }.to change(User, :count).by(1) 

としてそれを書くことができ

+0

何それは 'の前でだという事実について(各)'ブロック?それをそこから抜け出す方法はありますか? – Geo

+0

'' click_button "という行以外に" ''私はコードが正しい場所にあると思います。それは登録をテストするための準備であり、あなたのすべての例のためにそこに存在する必要があると思われるので、 'before(:each)'が良いです。 – tsherif

+0

また、 'before(:all)'/'before(:each)'の問題に対処するために何かを追加しました。 – tsherif

関連する問題