Можно ли в RSpec настраивать сопоставления в тестах, зависящих от реализации, на DRY? - PullRequest
4 голосов
/ 19 марта 2012

Я читаю новую версию "Rails Tutorial" Майкла Хартла и, так как я очень люблю BDD с Cucumber, я обнаружил, что обеспокоен тем, на что автор указывает здесь: http://ruby.railstutorial.org/chapters/sign-in-sign-out?version=3.2#sec:rspec_custom_matchers

В двух словах главная проблема с Cucumber заключается в том, что невозможно СУХОЙ зависящий от реализации тест, такой как:

Then /^he should see an error message$/ do
  page.should have_selector('div.alert.alert-error', text: 'Invalid')
end

написание пользовательских соответствий RSpec, например:

RSpec::Matchers.define :have_error_message do |message|
  match do |page|
    page.should have_selector('div.alert.alert-error', text: message)
  end
end 

Поскольку такой пользовательский сопоставитель должен быть помещен в spec / support / utilities.rb и может вызываться из интеграционных тестов RSpec, но не из определений шагов Cucumber.

Вы уверены / что вы думаете об этом?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2012

Вы, конечно, можете создавать сопоставители RSpec и использовать их в своих шагах Cucumber - я делаю это довольно часто. Я просто помещаю их в features/support/matchers, и они мгновенно доступны для использования в моих определениях шагов.

Если вы хотите поделиться ими с вашими тестами RSpec, вы можете извлечь их в отдельное местоположение типа shared_test, а затем вы можете require эту папку в файле Cucumber env.rb и ваш файл RSpec spec_helper.rb, тогда они будут доступны в обеих тестовых средах.

3 голосов
/ 02 апреля 2012

Вы можете поместить зависящие от реализации или повторно используемые методы, локаторы в Cucumber World.

Пример для вашего сценария:

# step_definitions/general_steps.rb
Then /^he should see an error message "(.+)"$/ do |text|
  within(error_message) do
    page.should have_content(text)
  end
end

# support/general_helpers.rb
module GeneralHelpers
  def error_message
    page.first('div.alert.alert-error')
  end
end

World(GeneralHelpers)

Вот несколько статей, которые ссылаются на этот подход:

0 голосов
/ 27 декабря 2014

Пример ответа Джона М о том, как вы можете использовать пользовательские средства сопоставления RSpec в Cucumber:

# spec/support/matchers/http.rb
RSpec::Matchers.define :return_http_success do
  match do |actual|
    actual >= 200 && actual <= 299
  end
end

# features/support/matchers.rb
Dir[Rails.root.join('spec/support/matchers/*.rb')].each { |file| require file }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...