6

テストしたいコールバックとカスタム検証を含む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」メソッドをテストする場合、それをパブリックにして、モデルRspecファイルで直接test_object.before_validationを呼び出す必要がありますか?
  2. そのカスタム検証メソッドunique?()が検証時に呼び出されるだけでなく、メソッド自体もテストする場合は、unique?()も公開する必要がありますか?

問題は、私がモデルの外で使用しているこれらのメソッドのどちらも(したがって、プライベートにする必要がある)、公開せずにテストするにはどうすればよいかということです。

4

1 に答える 1

3

テストの実装に巻き込まれるのは簡単ですが、これはテストの動作の良い候補です。

検証前に実際に何をしているのか、自問してみてください。次に、特定の入力が与えられた場合に、検証前が機能する場合にのみ特定の出力が得られることをテストします。

簡単な例として、単純なname属性を持つユーザーモデルがあり、単純に次のことを行うbefore_validationがあるとします。

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

次に、次のようにテストを作成できます。

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?方法にも当てはまります。どの特定の方法が使用されたか、または他の実装の詳細を気にすることなく、特定の入力を与えて動作をテストします。

于 2012-06-11T15:08:20.173 に答える