为什么 RSpecMatchers#have_title return 代码是绿色的?在我的产品中

Why RSpecMatchers#have_title return code is green ? in my product

我预计此代码为 return 红色,因为视图的标题部分的计算结果为 "Home | Ruby on Rails Tutorial Sample App"。但实际上,绿色是 returned。 另一方面,规范期望的视图的标题部分是 "Ruby on Rails Tutorial Sample App"。我不知道为什么会这样。

application.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

规格代码

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

发生这种情况是因为 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)

Capybara RSpec 匹配器 #have_title 在引擎盖下使用 Capybara 的 #assert_title (source)。

来自 #assert_title's docs:

#assert_title(string, **options) ⇒ true

Parameters:

  • string (String) — The string that title should include

注意是 "include"。如果您想要完全匹配,则有一个选项。来自文档:

Options Hash (**options):

  • :exact (Boolean) — default: false — When passed a string should the match be exact or just substring

由于 RSpec 匹配器只是将选项传递给此 #assert_title 方法,因此您应该能够按如下方式编写期望(不需要 #to_s 因为 @base_title 是一个字符串):

expect(page).to have_title(@base_title, exact: true)