cucumber capybara = has_content? возвращает true каждый раз

#ruby-on-rails #ruby-on-rails-4 #cucumber #capybara #minitest

#ruby-on-rails #ruby-on-rails-4 #огурец #capybara #минимальный тест

Вопрос:

я использую следующее:

 minitest 5.3.5
cucumber 1.3.15
capybara 2.3.0
capybara_minitest_spec 1.0.2
rails 4.1.1
cucumber-rails 1.4.1
 

и мой код cucumber / capybara

 Then(/^I should see "(.*?)"$/) do |string|
  page.has_content?(string)
end
 

с любой строкой, независимо от того, находится она на странице или нет, возвращает true . Я попытался использовать драгоценный камень capybara_minitest_spec, и мой код становится

 Then(/^I should see "(.*?)"$/) do |string|
  page.must_have_content(string)
end
 

тогда у меня ошибка

 Then I should see "Test" # features/step_definitions/pages_steps.rb:9
  undefined method `assert_page_has_content' for nil:NilClass (NoMethodError)
  (eval):4:in `must_have_content'
  ./features/step_definitions/pages_steps.rb:10:in `/^I should see "(.*?)"$/'
  features/can_access_home.feature:7:in `Then I should see "Test"'
 

Так странно. С помощью save_and_open_page я вижу свою страницу без каких-либо проблем. Не могли бы вы помочь мне, пожалуйста, исправить это?

PS: я использую minitest, но не rspec

Ответ №1:

Я исправил проблему со следующим

 Then(/^I should see "(.*?)"$/) do |string|
  assert page.has_content?(string)
end
 

Комментарии:

1. Да, вы должны утверждать. За исключением того, что здесь нет причины, по которой страница определена правильно и равна нулю при использовании page.must_have_content(string) . Можете ли вы дважды проверить, что эта вторая форма не работает?

2. неопределенный метод `must_have_content’ для #<Capybara::Session> (NoMethodError) :(((

3. Ну, это отличается от вашей первоначальной ошибки 🙂 Вероятно, вам нужно включить сопоставители где-нибудь в вашей настройке cucumber. В любом случае, использование assert так же хорошо.

Ответ №2:

 Then(/^I should see "(.*?)"$/) do |string|
  page.has_content?(string)
end
 

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

Если вы хотите подтвердить существование вашей строки, вы должны использовать :

 Then(/^I should see "(.*?)"$/) do |string|
  assert page.has_content?("Home#index")
end
 

page.must_have_content на самом деле делает то же самое, за исключением того, что ваша ошибка говорит page о nil .

Комментарии:

1. У меня есть неопределенный метод `expect’ для #<Cucumber::Rails::World:0x007f85bd7d96d8> (NoMethodError) для вашего последнего примера

2. Мой плохой, я не знаю, почему я думал, что вы используете rpsec. Ну, первое наблюдение все еще остается в силе, но есть проблема с посещением. Обновление anwser.

3. Хорошо, мы не знаем, почему page не было определено при первой попытке использования #must_have_content . Я все же оставляю этот ответ для дальнейшего ознакомления, поскольку он объясняет, что вы должны утверждать свои ожидания, а не просто возвращать логическое значение.