Подтвердить что ты не робот

Должен ли я заглушить модель в девушке Factory или в файле spec во время тестирования?

Почти каждый spec файл, который я прихожу, я в конечном итоге пишу вещи вроде:

  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

Если возможно выполнение stubbing внутри Factory.

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

4b9b3361

Ответ 1

В последних версиях factory_girl у вас есть обратный вызов after_build, поэтому я считаю, что вы можете определить свой factory следующим образом:

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

Ответ 2

Ответ @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-83960003

Ответ 4

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

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

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

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

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