73

私は Rails で TDD の旅を始めましたが、解決策が見つからないように見えるモデル検証のテストに関する小さな問題に遭遇しました。User モデルがあるとしましょう。

class User < ActiveRecord::Base
  validates :username, :presence => true
end

そして簡単なテスト

it "should require a username" do
  User.new(:username => "").should_not be_valid
end

これはプレゼンスの検証を正しくテストしますが、より具体的にしたい場合はどうすればよいでしょうか? たとえば、エラー オブジェクトで full_messages をテストします。

it "should require a username" do
  user = User.create(:username => "")
  user.errors[:username].should ~= /can't be blank/
end

最初の試行 (should_not be_valid を使用) に関する私の懸念は、RSpec が説明的なエラー メッセージを生成しないことです。それは単に「期待される有効な? false を返し、true になった」と言っているだけです。ただし、2 番目のテスト例には小さな欠点があります。エラー オブジェクトを取得するために、new メソッドの代わりに create メソッドを使用しています。

テスト対象をより具体的にしたいのですが、同時にデータベースに触れる必要はありません。

誰でも何か入力がありますか?

4

7 に答える 7

96

ROR を使用して TDD に取り組んでいただき、おめでとうございます。一度始めたら、決して振り返らないことをお約束します。

最も簡単で簡単な解決策は、次のように各テストの前に新しい有効なモデルを生成することです。

 before(:each) do
    @user = User.new
    @user.username = "a valid username"
 end

しかし、私が提案するのは、有効なモデルを自動的に生成するすべてのモデルのファクトリを設定し、個々の属性をいじって検証するかどうかを確認することです。これにはFactoryGirlを使用するのが好きです。

基本的に、テストをセットアップすると、次のようになります。

it "should have valid factory" do
    FactoryGirl.build(:user).should be_valid
end

it "should require a username" do
    FactoryGirl.build(:user, :username => "").should_not be_valid
end

ああ、これは私よりもよく説明している良いRailscastです。

幸運を :)


更新:バージョン 3.0 以降、factory girl の構文が変更されました。これを反映するようにサンプル コードを修正しました。

于 2011-09-24T05:22:24.460 に答える
44

モデルの検証 (およびより多くのアクティブ レコード) をテストする簡単な方法は、shoulda顕著ななどの宝石を使用することです。

彼らは次のようにテストを許可します:

describe User

  it { should validate_presence_of :name }

end
于 2011-10-01T19:00:03.730 に答える
16

これを試して:

it "should require a username" do
  user = User.create(:username => "")
  user.valid?
  user.errors.should have_key(:username)
end
于 2013-07-21T18:29:36.697 に答える