2011-01-12 18 views
1

私がテストをレールに新たなんだと私はレール統合テストデータの性質と混同だ:のRails:統合テストデータ

test "should register new user and login" do 
    .. 
    # create user 
    post users_path, :user => {:username => "newuser", :email => "[email protected]", 
    :password => "secret", 
    :password_confirmation => "secret"} 
    assert assigns(:user).valid? 
    .. 
end 

test "another should register new user and login" do 
    .. 
    # create user 
    post users_path, :user => {:username => "newuser", :email => "[email protected]", 
    :password => "secret", 
    :password_confirmation => "secret"} 
    assert assigns(:user).valid? 
    .. 
end 

私はそれを確実にするための検証を持っているユーザーモデルでは:ユーザ名と:電子メールは一意です。しかし、どのようにして、両方のデータを不平/エラー/無効なしでポストすることができたのでしょうか?何か助けていただければ幸いです。テスト用のDBが1つしかないと思ってテストデータが衝突しているはずです。ありがとう。

答えて

1

良い質問です。テストフレームワーク(Test :: Unit)が各テストを実行する前に、データベースを元の状態にリセットします。したがって、各テストの前に、DBにはフィクスチャーのデータのみが含まれていることが保証されています。

これは参考になります。次のテストを開始するときに、1つのテストのデータがそこに残らないようにする必要があります。もしそうであれば、(あなたはスイート全体ではなく)単独でテストを実行するか、別の順序でテストを実行するようなことをすれば、DBの状態は矛盾します。

解決策:usernameと:emailが一意であることを具体的に検証するテストを書くことができます。例を挙げる前に、この検証のための機能テストを書いたようです。これは、ユーザに見られる動作を検証しているために魅力的ですが、Railsの検証ルールがモデルにプッシュダウンされるため、検証をテストする場所がユニットテストにあります。この程度の良い記事で

test "should validate unique email" do 
    attributes = { :username => "newuser", :email => "[email protected]", :password => "secret", :password_confirmation => "secret" } 
    # create user 
    user1 = User.create(attributes) 
    assert_nil user1.errors.on(:username) 
    assert_nil user1.errors.on(:email) 

    # create another user with the same name and email 
    user2 = User.create(attributes) 
    assert_not_nil user2.errors.on(:username) 
    assert_not_nil user2.errors.on(:email) 
end 

:だからここにあなたがユニットテストを書くことができ一つの方法だ

(。あなたは、コントローラの束にまたがって検証ルールを複製する必要はありません検証DRYを保つために) 、John Nunemaker's blog post from two years agoを参照してください。コードサンプルで偶発的なHTMLタグを無視します。 NunemakerはすばらしいRailsブロガーです。

Shouldaのようないくつかの代替テストライブラリには、モデルが一意性を検証することを検証する組み込み関数があります。しかし、あなたがRailsに慣れていないので、今はデフォルトのテストフレームワークを使うことをお勧めします。実際には、Railsを考案した37人の方々がまだデフォルトを使用していますので、多くのことが言えます。また、デフォルトを使用することをお勧めします)。

ちなみに、StackOverflowの質問4つのスペースでインデントします。

+0

各テストのデータは新しいので、それは私が探している答えです:)ありがとう。うん、私はここまで来たので、4つのインデントのヒントにも感謝しています。 – tipbis

関連する問題