2016-07-28 3 views
0

Я недавно пристраивание полнометражных спецификаций внутри «спецификация/особенность», а в середине бонусной спецификации, я решил попробовать сделать этоЯвляется ли слияние спецификаций Feature и Request поддерживаемым поведением rspec?

context "foo", type: :request do 
    it "works" do 
    get some_path 
    expect(response.body).to eq("something") 
    visit some_path 
    expect(page).to have_content("something") 
    end 
end 

К моему удивлению, он действительно работал. Как правило, в спецификации спецификации вы не можете использовать методы get, post и т. Д. И в спецификации запроса вы не можете вызвать метод capybara visit. Это работает и наоборот. Если я использую спецификацию запроса внутри «spec/requests», я могу пометить вещи с помощью функции и получить такое же поведение.

Поддерживается ли это поведение rspec? Я понимаю, что с этим могут возникнуть конструктивные/концептуальные проблемы, но есть ли технические недостатки, чтобы совместить их?

ответ

1

Причина, по которой то, что мы теперь знаем как характеристики спецификации и спецификации запроса, разделяется на отдельные каталоги, обозначается в this blog post.

В целом, однако, разделив их было сделано в Капибара 2.0, чтобы облегчить путаницу иметь один вид спецификации, то request спецификации, отвечает за выполнение тестов интеграции полный стек , а также спецификации высокого уровня который будет управлять приложением только с использованием его внешнего интерфейса (обычно это делается через безгласный веб-браузер). Таким образом, в настоящее время в целом согласованной структуры спецификации будет:

  • Положите что-нибудь, что использует водосвинка DSL (visit и т.д.), чтобы утверждать на page объекта в spec/features
  • Put полный стек спецификации без контроллера, что использовать стойку DSL (get и т.д.), чтобы утверждать на response объекта в spec/requests

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


Что касается почему вы можете совместно смешаться спецификации, если вы хотите, это в основном связано с конфигурацией RSpec, поэтому поддерживается поведение:

  • Вы, вероятно, имеют линию config.infer_spec_type_from_file_location! в вашем rails_helper.rb где-нибудь, что означает, что RSpec рассмотрит любые файлы в spec/features быть полнометражных спецификации и любые файлы в spec/requests быть запрос спецификации
  • Поэтому, даже если вы обернуть type: :request флага вокруг спецификации в папке spec/features, следовательно, дает, что доступ к одной спецификации к Rack DSL, он будет еще имеет доступ к Capybara DSL

Вы можете даже использовать RSpec.config, чтобы позволить водосвинке DSL в любой тип спецификации или путь к каталогу, вы хотите, хотя это not recommended:

RSpec.configure do |config| 
    config.include Capybara::DSL, type: :request 
    config.include Capybara::DSL, file_path: %r{spec/requests} 
end 

в целом, хотя, ради вашего кодовую, будущем вы, и ваши будущие коллеги, это, вероятно, лучше, чтобы попытаться сохранить все в нужном месте ,

+0

Спасибо за отличную информацию. – CodeSmith

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