1. ホーム
  2. ruby-on-rails

Rails 3.1、RSpec: モデルの検証をテストする

2023-10-04 10:23:24

質問

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が説明的なエラーメッセージを生成しないことです。しかし、2 番目のテスト例には小さな欠点があります。

私はテストが何をテストしているのかについてより具体的であることを望みますが、同時にデータベースに触れる必要はないでしょう。

どなたかご意見をお聞かせください。

どのように解決するのですか?

ROR を使った TDD への試み、おめでとうございます!一度始めたら、もう振り返ることはありませんよ。

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

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

しかし、私が提案するのは、すべてのモデルにファクトリーを設定して、自動的に有効なモデルを生成させ、個々の属性に手を加えて、検証を確認することです。私は ファクトリーガール を使います。

基本的に、一度セットアップすると、テストはこのようになります。

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

それから、これは 良いレールキャスト で、私よりうまく説明しています。

幸運を祈ります :)


最新情報:現在 バージョン3.0 で、ファクトリーガールの構文が変更になりました。これを反映して、サンプルコードを修正しました。