Почему код возврата RSpecMatchers # have_title зеленый? в моем продукте - PullRequest
1 голос
/ 23 февраля 2020

Я ожидал, что этот код вернется красным, потому что часть заголовка представления оценивается как "Home | Ruby в учебном приложении Rails Tutorial". Но на самом деле, зеленый был возвращен. С другой стороны, заглавная часть представления, которого ожидает спецификация, - «Ruby в учебном приложении Rails Tutorial Sample». Я не знаю, почему это произойдет.

приложение. html .haml - это обычный макет.

!!! 5
%html
  %head
    %title 
      = full_title(yield(:title))
    = csrf_meta_tags
    = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
  %body
    = yield

home. html .haml - просмотр содержимого

= provide(:title, "Home")
%h1 Sample App
%p
  This is the home page for the
  %a{href: 'https://railstutorial.jp/'} Ruby on Rails Tutorial
  sample application.
module ApplicationHelper
  def full_title(page_title = '')
    base_title = 'Ruby on Rails Tutorial Sample App'
    base_title if page_title.empty?

    page_title + ' | ' + base_title
  end
end

spe c код

RSpec.describe 'static_controller', type: :system do
  before do
    @base_title = 'Ruby on Rails Tutorial Sample App'
  end
  describe 'Home' do
    it 'check title' do
      visit root_url
      expect(page).to have_title @base_title.to_s
    end
  end
end

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Capybara RSpe c matcher #have_title использует Capybara's #assert_title под капотом ( source ).

Из #assert_title документов :

#assert_title(string, **options) ⇒ true

Параметры:

  • string (String) - строка, которая должна содержать заголовок

Обратите внимание, что говорит "включить". Если вы хотите точное соответствие, есть вариант для этого. Из документов:

Опции Ха sh (**options):

  • :exact (Boolean) - по умолчанию: false - Когда передал строку, если совпадение будет точным или просто подстрокой

Поскольку средство сопоставления RSpe c просто передает параметры этому методу #assert_title, вы должны иметь возможность записать ожидание как следует (не нужно #to_s, поскольку @base_title - строка):

expect(page).to have_title(@base_title, exact: true)
0 голосов
/ 23 февраля 2020

Это происходит из-за того, что по умолчанию have_title соответствует совпадению подстроки - https://www.rubydoc.info/github/teamcapybara/capybara/Capybara/Node/DocumentMatchers: has_title% 3F

Если вы хотите пройти точное совпадение exact: true

ожидайте (стр.) .To have_title (@ base_title.to_s, точное: true)

...