2012-06-11 9 views
6

私はいくつかのコールバックとテストしたいカスタムバリデーションを持つActiveRecordモデルを持っています。つまり、私はすべてを公開させなければならないということです。これは良い習慣であるか、この場合にはよりよい解決策ですか?私がテストしたいメソッドのRuby on Rails:すべてのActiveRecordコールバックメソッドをプライベートにする必要がありますか?

例:つまり

def before_validation 
    original.edit(self) if original 
    end 

    validate :unique?, on: :create 

    def unique? 
    return true if original.blank? 
    errors.add(:base, 'The entry already exists') 
    false 
    end 

  1. 私は「before_validation」メソッドをテストしたい場合は、私はそれを公開するとtest_objectを呼び出す必要があります.before_validationは私のモデルのRspecファイルに直接ありますか?
  2. 検証する際にユニークなカスタム検証メソッド(?)が呼び出されるだけでなく、メソッド自体もユニークな(?)パブリックも作成する必要がありますか?

問題は、これらの方法のどちらも私のモデルの外で使用していない(したがって、彼らはプライベートにする必要があります)が、どのように公開しないとテストできますか?

答えて

3

テストの実装に巻き込まれるのは簡単ですが、これは動作をテストするのに適しています。

あなたに確認する前に、実際に何をしているのですか?次に、特定の入力があると、検証前にのみ、特定の出力を得るテストを自分自身にしてください。

name = "Auto-generated name." if name.blank? 

は、その後、あなたがこのようにそれのためにテストを書くことができます:

簡単な例として

、あなたは簡単なname属性を持つユーザモデルを持っている、とあなたは、単にんbefore_validationを持っている想像

it "gets an auto-generated name if none is specified." do 
    user = User.create! 
    user.name.should eq "Auto-generated name." 
end 

it "does not get an auto-generated name if one is specified." do 
    user = User.create!(:name => "Test Name") 
    user.name.should eq "Test Name" 
end 

このテストでは検証がテストされていますが、その動作をテストしているだけなので、パブリックにする必要はありません。あなたのunique?メソッドについても同じことが言えます。どの特定のメソッドが使用されたか、その他の実装の詳細について気にすることなく、特定の入力を与え、動作をテストします。

関連する問題