Должен ли я заглушить модель в девушке 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.
Каков правильный способ заглушить модель?
Ответы
Ответ 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
Ответ 3
Вы также можете использовать FactoryGirl # build_stubbed.
Ответ 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, который переопределяет методы, которые вы хотите заглушить.