2010-12-13 5 views
6

私はRSpecの2.0.0でreject_if一部をテストするユーザモデルテスト:anafでreject_if

class User < ActiveRecord::Base 
    has_many :languages, :dependent => :destroy 
    accepts_nested_attributes_for :languages, :reject_if => lambda { |l| l[:name].blank? } 
end 

を持っています。現在、私は、私がテストに非常に新しいですが、その

it "should not save language without name by accepts_nested_attributes" do 
    lambda { 
     @user.update_attributes!("languages_attributes"=>{"0"=>{}}) 
    }.should_not change(Language, :count) 
    end 

    it "should save language with name by accepts_nested_attributes" do 
    lambda { 
     @user.update_attributes!("languages_attributes"=>{"0"=>{"name"=>"lang_name"}}) 
    }.should change(Language, :count).by(1) 
    end 

のための2つの簡単なテストケースを持っており、それは本当に奇妙な私見を探します。 これがreject_ifをテストする正しい方法だと思いますか?そしてそれを行うためのより良い方法がありますか?それはnameは空白になって、その後、trueなら

anaf_for_languages = User.nested_attributes_options[:languages] 
anaf_for_languages[:reject_if].call({ "name" => "" }).should be_true 

を:私はあなたがこれを行うにはreject_ifその後、最善の方法をテストするために探していることがわかり

答えて

10

は、直接それをテストすることです。これはあなたのコードよりも少し簡潔ですが、すぐには分かりません。

+0

あなたのアプローチは明確で、私はそれをupvotedしました。あなたの例は、ビューとフォームに依存せず、良いと思う=>より多くの孤立。しかし、ユーザーが言語名フィールドを空白にしてフォームを送信したときに、言語レコードが保存されていないかどうかをチェックすることが正しい方法であるかどうかはわかりません。たぶんこれは別の質問ですが、単体テストのときにできるだけ多くのものか​​ら分離するか、実際のアプリケーションワークフローをシミュレートしようとすると良い戦略はありますか?答えが後者の場合、私の例は有効で正しいですか? –

+0

@タダス:元の質問には、意見や形について何もなかったので、私はその点で自分の能力の中で最高のものに答えました。このビュー/フォームをテストする場合は、フルスタック統合テストのためにCucumberやSteakなどをお勧めします。 –

関連する問題