9

モデルをテストするために、Shoulda rspec マッチャをいくつか使用しています。そのうちの 1 つは次のとおりです。

describe Issue do
  it { should_not allow_value("test").for(:priority) }
end

これに関する私の問題は、私のモデルでの検証が次のようになることです。

validates_format_of :priority, :with => /^(Low|Normal|High|Urgent)$/, :on => :update

したがって、このテストを実行すると、次のようになります。

1) 'Issue should not allow priority to be set to "test"' FAILED
   Expected errors when priority is set to "test", got errors: category is invalid (nil)title can't be blank (nil)profile_id can't be blank (nil)

更新時にのみ実行されるため、検証はトリガーされません。更新と作成でこれらのマッチャーを使用するにはどうすればよいですか?

4

1 に答える 1

12

これをもっとうまく処理するべきだと思います。新しいユーザーを作成するときに User モデルの一意性検証チェックのみを実行したいので、これに遭遇しました。ユーザー名の変更を許可していないため、更新時にデータベースクエリを実行するのは無駄です。

validates :username, :uniqueness => { :case_sensitive => false, :on => :create },

幸いなことに、「件名」を明示的に定義することでこれを回避できます。

  describe "validation of username" do
      subject { User.new }
      it { should validate_uniqueness_of(:username) }  
  end

この方法では、新しいインスタンスでのみテストされます。あなたの場合、必要なすべてのフィールドが設定された状態で、件名をデータベースに既に保存されているものに変更することができます。

于 2011-03-20T22:59:00.030 に答える