为什么 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(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)
我预计此代码为 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(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)