Я усердно работаю, пытаясь сохранить свои файлы спецификаций как можно более чистыми. Использование гема «shoulda» и написание настраиваемых сопоставителей, которые следуют одному и тому же шаблону.
Мой вопрос касается создания пользовательского сопоставителя, который будет обертывать expect{ post :create ... }.to change(Model, :count).by(1)
и может использоваться в тех же группах примеров с другими сопоставителями «следует». Подробности ниже:
Пользовательский сопоставитель (упрощенный)
RSpec::Matchers.define :create_a_new do |model|
match do |dummy|
::RSpec::Expectations::ExpectationTarget.new(subject).to change(model, :count).by(1)
end
end
Рабочий пример
describe 'POST create:' do
describe '(valid params)' do
subject { -> { post :create, model: agency_attributes } }
it { should create_a_new(Agency) }
end
end
Это работает нормально, пока я использую subject
лямбда, а мой сопоставитель — единственный в группе примеров.
Неудачные примеры
Неудачный пример 1
Добавление большего количества примеров в ту же группу приводит к сбою другого сопоставителя, потому что subject
теперь является лямбдой, а не экземпляром контроллера.
describe 'POST create:' do
describe '(valid params)' do
subject { -> { post :create, model: agency_attributes } }
it { should create_a_new(Agency) }
it { should redirect_to(Agency.last) }
end
end
Неудачный пример 2
Сопоставитель «должен» ожидать, что я определю блок before
, но это становится несовместимым с моим пользовательским сопоставителем
describe 'POST create:' do
describe '(valid params)' do
before { post :create, agency: agency_attributes }
it { should create_a_new(Agency) }
it { should redirect_to(Agency.last) }
end
end
Ожидаемый результат
Я ищу способ написать свой собственный сопоставитель, который поместился бы в той же группе примеров, что и другие сопоставители, что означает, что мой пользовательский сопоставитель должен использовать блок before
для выполнения действия контроллера, «неудачный пример № 2» выше - это то, как я хотел бы написать свои характеристики. Является ли это возможным?
Спасибо за прочтение