RSpecのany_instance_of
メソッド(例:expect_any_instance_of
)を使うのは悪い習慣であるという文章に遭遇したようです。良質なドキュメントでは、「レガシーコードを使って作業する」セクション(http://www.relishapp.com/rspec/rspec-mocks/v/3-4/docs/working-with-legacy-code/any-instance)にこれらのメソッドをリストしています。これは、これを利用して新しいコードを書くべきではないことを意味します。新しいインスタンスのメソッドを呼び出す関数をテストする "正しい"方法は何ですか?
私はこの機能に依存する新しい仕様を日常的に書いているように感じています。優れた例は、新しいインスタンスを作成し、その上でメソッドを呼び出すメソッドです。 (mymodelというのActiveRecordのあるレールで)私は定期以下のような何かを行う方法を記述します。
def my_method
my_active_record_model = MyModel.create(my_param: my_val)
my_active_record_model.do_something_productive
end
を私は一般的にexpect_any_instance_of
を使用して呼び出されdo_something_productive
を探している私の仕様を記述します。例えば:
my_double = double('my_model')
expect(MyModel).to receive(:create).and_return(my_double)
expect(my_double).to receive(:do_something_productive)
subject.my_method
は、しかし、私はこれより悪く考えるので)それが長く、遅くなります:私はこれを仕様に見ることができます
expect_any_instance_of(MyModel).to receive(:do_something_productive)
subject.my_method
唯一の他の方法は、このようなスタブの束となりb)それは最初の方法よりはるかに脆い白い箱です。その後、
def my_method
my_active_record_model = MyModel.new(my_param: my_val)
my_active_record_model.save
my_active_record_model.do_something_productive
end
スペック切断の二重のバージョンを、しかしany_instance_of
バージョンが正常に動作します:私は次のようにmy_method
を変更した場合、第二の点を説明するために。
私の質問は、他の開発者はどのようにこれをやっているのですか? any_instance_of
を使用して私のアプローチは悩んでいますか?もしそうなら、なぜですか?
'create_productively'メソッドでまったく同じ問題が発生していませんか? –
モデル上でメソッドを作成して呼び出すだけでなく、より多くの作業を行った方がより明らかに役立ちます。しかし、いずれにせよ、私の更新を参照してください。 –
つまり、 'create_productively'をどうやってテストするのでしょうか?私はこれがどのように役立つのか分かりません。たぶん私はそれを見逃しているかもしれない。 –