为什么这种Capbara'has_content'的期望意外地传递了?

时间:2017-05-31 19:04:08

标签: ruby capybara acceptance-testing

我正在尝试进行一些验收测试,并确认在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>

2 个答案:

答案 0 :(得分:1)

have_content匹配(默认情况下)进行子串匹配。如果quote.industry为nil,它将被内插到一个空字符串,该字符串是页面上任何内容的子字符串,因此测试将通过。

答案 1 :(得分:-1)

测试仍然通过,因为内容仍然存在(请检查您的页面来源)。如果要注释掉erb输出,则必须使用正确的语法:

<% =begin %>  
  <% my_code %>
<%=end %>

用于多行注释和

<%# my_code %>

单行。

我们讨论了这个主题(我的意思是评论,而不是测试)herehere again