我正在尝试进行一些验收测试,并确认在Quote#show页面上呈现模型的各种属性。我使用的代码如下所示;
expect(page).to have_content("#{quote.industry}")
我正在使用FactoryGirl与Quote.create
所需的对象attrs。 Quote.industry
是在报价模型上创建的enum
,带有一系列选项,所有工作和渲染都很好。然而,当我在模板上注释掉这个属性的diaplay时,测试仍然通过。页面上没有与quote.industry匹配的其他元素。我无法解决发生的事情?
实际上了解上面发生了什么,或许是将一个值插入到Capybara匹配器参数中的错误形式?应该坚持给have_content
匹配器提供字符串吗?
但也许给出has_content的参数应该只是一个字符串,而不是插值的FactoryGirl对象。这是可接受的做法吗?
由于
quote_page_spec.rb
require 'rails_helper'
feature 'quote page' do
scenario 'renders all quote attributes' do
quote = FactoryGirl.create(:quote)
visit("/quotes/#{quote.id}")
expect(page).to have_content("#{quote.industry}")
end
end
工厂/ quotes.rb
FactoryGirl.define do
factory :quote do
sequence(:co_name) { |n| "Acme Co #{n}" }
industry Quote.industries[:financial_services]
end
end
模型/ quote.rb
class Quote < ApplicationRecord
enum industry: [ :financial_services, :architect, :business_consultancy ]
enum payment_frequency: [ :annually, :monthly ]
end
show.html.erb
<div class="container">
<div class="row">
<div class="col-md-6">
<table class="table table-bordered table-responsive">
<thead>
<tr>
<th>Property</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Company name</td>
<td><%= @quote.co_name %></td>
</tr>
<tr>
<td>Company number</td>
<td><%= @quote.co_number %></td>
</tr>
<tr>
<td>Office postcode</td>
<td><%= @quote.postcode %></td>
</tr>
<!-- <tr>
<td>Industry</td>
<td><%= @quote.industry %></td>
</tr> -->
</tbody>
</table>
</div>
</div>
</div>
答案 0 :(得分:1)
have_content
匹配(默认情况下)进行子串匹配。如果quote.industry
为nil,它将被内插到一个空字符串,该字符串是页面上任何内容的子字符串,因此测试将通过。
答案 1 :(得分:-1)
测试仍然通过,因为内容仍然存在(请检查您的页面来源)。如果要注释掉erb
输出,则必须使用正确的语法:
<% =begin %>
<% my_code %>
<%=end %>
用于多行注释和
<%# my_code %>
单行。
我们讨论了这个主题(我的意思是评论,而不是测试)here和here again。