6

典型的な ActiveRecord モデルを考えると、before_save入力を解析するコールバックがよくあります。たとえばtime_string、ユーザーからのようなものを取得してtimeフィールドに解析します。

そのセットアップは次のようになります。

before_save :parse_time
attr_writer :time_string

private
def parse_time
  time = Chronic.parse(time_string) if time_string
end

コールバック メソッドを非公開にすることがベスト プラクティスと見なされていることを理解しています。ただし、プライベートの場合は、個別に呼び出して個別にテストすることはできません。

では、経験豊富な Rails テスターの皆さんは、この種のテストをどのように処理していますか?

4

3 に答える 3

10

Ruby では、Private メソッドは引き続きObject#send

次のように、単体テストにこれを利用できます。

project = Project.new
project.time_string = '2012/11/19 at Noon'
assert_equal(project.send(:parse_time), '2012-11-19 12:00:00')
于 2012-12-19T21:45:16.250 に答える
4

私がすることは、オブジェクトの状態newまたはbuildインスタンスを保存し、オブジェクトを保存して、変更された属性の値に基づいてアサーションまたは期待を作成することですbefore_save

post = Post.new
post.time_string = '2012/11/19'
expected_time = Chronic.parse(post.time_string)
post.save
assert_equal(post.time, expected_time)

そうすれば、必ずしもメソッドの実装ではなく、オブジェクトがどのように動作するかの動作をテストできます。

于 2012-12-19T21:54:18.967 に答える
0

ifコールバックに条件がある場合があり、その場合は を使用しますrun_callbacks

before_save :parse_time, :if => Proc.new{ |post| post.foo == 'bar' } 

~によって肯定的にテストされる

post = Post.new
post.foo = 'bar'
expected_time = Chronic.parse(post.time_string)
post.run_callbacks :before_save
assert_equal(post.time, expected_time)

そして否定的に

post = Post.new
post.foo = 'wha?'
post.run_callbacks :before_save
assert_nil(post.time)

詳細については、APIブログを参照してください。

于 2016-06-03T01:22:03.947 に答える