8

テストには FactoryGirl と Rspec を使用しています。nil の場合、モデルは init の後に外部キーを設定します。そのため、別の協会のデータを使用しています。しかし、どうすればテストできますか?通常、このオブジェクトの作成にはファクトリを使用し、「self.user.main_address.country_id」には stub_chain を使用します。ただし、このオブジェクトの作成により、after initialize が呼び出されます。私はそれをスタブする機会がありません。

after_initialize do
  if self.country_id.nil?
    self.country_id = self.user.main_address.country_id || Country.first.id
  end
end

何か案が?

4

3 に答える 3

10

理想的には、実装ではなく動作をテストすることをお勧めします。メソッドが呼び出されることをテストする代わりに、外部キーが設定されることをテストします。

ただし、ここでコールバックをテストする場合after_initializeは、機能する方法です。

obj = Model.allocate
obj.should_receive(:method_here)
obj.send(:initialize)

Allocateはオブジェクトをメモリに配置しますが、 を呼び出しませんinitialize。期待値を設定したら、initialize を呼び出してメソッド呼び出しをキャッチできます。

于 2012-04-24T20:36:55.017 に答える
6

Orlando の方法は機能しますが、ここに追加したい別の方法があります。(新しい rspec 'expect' 構文を使用)

expect_any_instance_of(Model).to receive(:method_here)
Model.new
于 2016-01-31T00:11:03.630 に答える