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 人であることを確認するにはどうすればよいですか?

第二に、beforeそれは仕事をしているにもかかわらず、私にはまったく正しくないようです. この登録ユースケース全体のテストを作成する別の方法はありますか? おそらく、何らかの形で前の部分を再定式化するか、それとも私がやっている方法で受け入れられますか?

更新:テストが失敗し始めたため、 を変更before(:all)しました。before(:each)を使用していると、応答の本文が不完全なようですbefore(:all)。その理由をたまたま知っていますか?

4

2 に答える 2

2

次のように書くこともできます

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

このリンクを見てください:http://ruby.railstutorial.org/chapters/sign-up?version = 3.2#sec:tests_for_user_signup

于 2012-04-06T12:25:46.493 に答える
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ブロック)の前に1回呼び出されますが、ブロック内のすべての例の前に1回だけbefore(:all)呼び出されます。これが一般的に推奨されない理由です。なぜなら、あなたの例のいずれかが初期状態について何かを変更した場合、後の例が影響を受けるからです。describebefore(:all)

于 2012-04-06T11:58:44.380 に答える