Должен ли я заглушить модель в Factory girl или в файле спецификации во время тестирования? - PullRequest
22 голосов
/ 31 января 2012

Почти каждый файл спецификаций, с которым я сталкиваюсь, в итоге пишет что-то вроде:

  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

Если заглушка на фабрике возможна.

Как правильно заглушить модель?

Ответы [ 4 ]

29 голосов
/ 30 июня 2015

@ fkreusch прекрасно работает, пока вы не используете новый синтаксис RSpec expect() (3.0 +)

Помещение в rails_helper.rb работает для меня:

FactoryGirl::SyntaxRunner.class_eval do
  include RSpec::Mocks::ExampleMethods
end

В примере с OP теперь вы можете сделать:

FactoryGirl.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_girl/issues/703#issuecomment-83960003

21 голосов
/ 31 января 2012

В последних версиях 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

UPDATE

После 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
3 голосов
/ 05 сентября 2017

Фабрика должна производить объекты "реального мира", поэтому изменение поведения (то есть заглушки) на фабрике - плохая практика (то есть заглушка).

Вы можете сделать

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

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

и если ваше предложение before становится слишком большим, вы можете извлечь его в отдельный метод или создать фиктивный дочерний класс, который переопределяет методы, которые вы хотите заглушить.

3 голосов
/ 06 июня 2014

Вы также можете рассмотреть возможность использования FactoryGirl # build_stubbed .

...