私が遭遇するほとんどすべてのスペックファイルは、次のようなものを書くことになります。
before :each do
@cimg = Factory.build :cimg_valid
@cimg.stub(:validate_img).and_return true
@cimg.stub(:validate_img_url).and_return true
@cimg.stub(:save_images).and_return true
@cimg.stub(:process_image).and_return true
@cimg.stub(:img).and_return true
end
つまり、Factory.buildから取得したモデルは完全に有効です。しかし、そのようなものをスタブ化しないと、ファイルシステムに保存され、テストしていないものが検証されます...
つまり、次のようなことを行う方がクリーンだと思います。
before :each do
@cimg = Factory.build :cimg_for_testing_tags
end
工場内でのスタブも可能であれば。
モデルをスタブ化する適切な方法は何ですか?
Factory_girlの最近のバージョンでは、after_buildコールバックがあるので、次のようにファクトリを定義できると思います。
FactoryGirl.define do
factory :cimg_for_testing_tags do
... # Factory attributes
after_build do |cimg|
cimg.stub(:validate_img).and_return true
end
end
end
[〜#〜]更新[〜#〜]
Factory_girl 3.3.0以降、構文は次のように変更されました。
FactoryGirl.define do
factory :cimg_for_testing_tags do
... # Factory attributes
after(:build) do |cimg|
cimg.stub(:validate_img).and_return true
end
end
end
@fkreuschの答えは、新しいRSpec expect()
構文(3.0+)を使用するまではうまく機能します
これをRails_helper.rb
に入れるとうまくいきます:
FactoryBot::SyntaxRunner.class_eval do
include RSpec::Mocks::ExampleMethods
end
OPの例では、次のことができます。
FactoryBot.define do
factory :cimg_for_testing_tags do
... # Factory attributes
after(:build) do |cimg|
allow(cimg).to receive(:validate_img) { true }
end
end
end
クレジット:github.com/printercu、参照: https://github.com/thoughtbot/factory_bot/issues/703#issuecomment-839600
ファクトリは「実世界」のオブジェクトを生成する必要があるため、ファクトリの動作(つまりスタブ)を変更することは悪い習慣(そしてエラーが発生しやすい)です。
できるよ
let(:user) instance_double(User, FactoryGirl.attributes_for(:user))
before do
allow(user).to receive(:something).and_return('something')
end
before
句が大きくなりすぎた場合は、それを別のメソッドに抽出するか、スタブ化するメソッドをオーバーライドするモック子クラスを作成することをお勧めします。
FactoryGirl#build_stubbed の使用を検討することもできます。