web-dev-qa-db-ja.com

テスト中にファクトリーガールまたはスペックファイルでモデルをスタブする必要がありますか?

私が遭遇するほとんどすべてのスペックファイルは、次のようなものを書くことになります。

  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

工場内でのスタブも可能であれば。

モデルをスタブ化する適切な方法は何ですか?

23
Zequez

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
21
fkreusch

@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

31
Ho-Sheng Hsiao

ファクトリは「実世界」のオブジェクトを生成する必要があるため、ファクトリの動作(つまりスタブ)を変更することは悪い習慣(そしてエラーが発生しやすい)です。

できるよ

let(:user) instance_double(User, FactoryGirl.attributes_for(:user))

before do
  allow(user).to receive(:something).and_return('something')
end

before句が大きくなりすぎた場合は、それを別のメソッドに抽出するか、スタブ化するメソッドをオーバーライドするモック子クラスを作成することをお勧めします。

3
thisismydesign

FactoryGirl#build_stubbed の使用を検討することもできます。

3
Su Zhang