2016-02-09 4 views
0

У меня есть объект ActiveRecord, который создается/сохраняется примерно в 50% моего пакета RSpec. Я хочу заглушить его проверку через набор, кроме контекста, где я явно проверяю поведение проверки.Проверка валидации на ActiveRecord через набор тестов RSpec

Для достижения этой цели, я погасил ее глобально с помощью конфигурации

config.before(:each) do 
    allow_any_instance_of(Activerecord::Abc).to receive(:abc_validate).and_return(true) 
end 

, а затем переписал окурок в конкретном контексте

context "Validations" do 
    context "abc_validate" do 
    before :each do 
     allow_any_instance_of(Activerecord::Abc).to receive(:abc_validate).and_call_original 
    end 

    it "should ..... " do 
     ........ 
    end 
    end 
end 

Это соответствует моим требованиям. Тем не менее, это не эффективно, поскольку, хотя мне нужен заглушка только для примерно 50% моего набора тестов RSpec, я на самом деле укусил его для каждого модульного теста. Даже модульные тесты, которые не нуждаются в заглушке, будут иметь острую функцию.

Есть ли лучший способ сделать это?

Я думал о другом: вместо того, чтобы накладывать метод, я могу повторно открыть класс в RSpec и переписать функцию пользовательской проверки.

Activerecord::Abc.class_eval do 
    def abc_validate(testing_self = false) 
    testing_self ? super : true 
    end 
end 

Однако этот подход кажется слишком хриплым.

Версия детали -

  1. Rails 4.2.4
  2. Rspec 3.3.0
+0

Stubbing кажется прекрасным для меня. Я все время занимаюсь этим целым набором тестов. Вы обеспокоены тем, что ваш заглушка замедляет ваш набор тестов? –

ответ

0

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

Таким образом, я бы предложил обернуться, используя действительный объект во всех ваших тестах, ожидающих определенного контекста, в котором вы тестируете его создание и проверку.

Если для создания действительного объекта требуется много настроек, вы можете использовать fixtures или FactoryGirl gem, чтобы центризировать эту логику в одном месте. Создание действительного объекта будет простой проблемой вызова FactoryGirl.create(:abc).

Смежные вопросы