首页 文章

这个失败的单选按钮功能是否会测试Capybara语法问题?

提问于
浏览
0

我有一个带有布尔attr prev_cover 的单选按钮的表单,在浏览器中显示是或否,参数值为true或false,并在db中保存为true或false,如数据类型boolean . 我在尝试着:

  • a)模型测试存在选择的单选按钮

  • b)功能测试创建整个报价记录 .

通过验证 prev_cover ,我告诉capybara within(".quote_prev_cover") { choose('No') } create_quote_spec测试失败,模型quote.rb测试通过 .

随着 prev_cover 的验证到位,我告诉capybara within(".quote_prev_cover") { choose('Yes') } create_quote_spec测试通过,模型quote.rb测试通过 .

在实际的手动浏览器测试中,当选择“是”或“否”时,将创建数据库记录 .

当我从quote.rb中删除prev_cover的在线验证时,create_quote_spec随prev_cover选择是或否,但当然模型quote_spec.rb测试失败 .

我无法看到问题出在哪里,是否与capybara within(".quote_prev_cover") { choose('No') } 语法有关? (它发现css元素很好)

这是new.html.erb的表单元素

<div class='container'>
    <div class='row'>
        <div class='col-md-6'>
            <%= simple_form_for @quote do |f| %> 
                <%= f.input :prev_cover, as: :radio_buttons, label: "Previous cover" %>
                <%= f.submit "Get quote", class: 'btn btn-primary' %>
            <% end %>
        </div>
    </div>
</div>

这是quote.rb验证;

validates :prev_cover, inclusion: { in: [true, false] }

这是由Capybara创建的名为NewQuoteFrom.new的 prev_cover 元素;

within(".quote_prev_cover") { choose('No') }

如果选择prev_cover'否',那么测试失败,如果选择'是'则传递,create_quote_spec.rb

feature 'creating quote request' do
let(:user) { FactoryGirl.create(:user) }
let(:new_quote_form) { NewQuoteForm.new }

before do
    login_as(user, :scope => :user) 
end

scenario 'completing quote data' do
    new_quote_form.visit_page.fill_in_with().submit
    expect(page).to have_content('Quote request created')
end

这是模型验证存在时通过的模型测试,quote_spec.rb;

context 'previous cover' do
        it 'must be true or false' do
            quote = Quote.new(prev_cover: nil)
            quote.valid?
            expect(quote.errors[:prev_cover]).not_to be_empty
        end 
    end

失败的测试消息:

1) creating quote request completing quote data
 Failure/Error: expect(page).to have_content('Quote request created')
   expected to find text "Quote request created" in "Toggle navigation QuoteEngine My Quotes My Account Sign out Complete the below to get a quote * GLA Previous coverYesNois not included in the list * Company name * Company number * Postcode * Industry Financial services Architect Business consultancy Lives overseasYesNo Scheme start date 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 January February March April May June July August September October November December 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Payment frequency Annually Monthly Commission level"
 # ./spec/features/create_quote_spec.rb:14:in `block (2 levels) in <top (required)>'

请注意错误消息中的 YesNois not included in the list ,使用Capybara指令中的任何true或false变体都不起作用 .

甚至指定:

<%= f.input :prev_cover, as: :radio_buttons, :collection => [['Yes', true],
                                    ['No', false]], label: "Previous cover" %>

在new.html.erb视图的simpl_form_for中仍然会导致验证失败 Previous coverYesNois not included in the list

即使 within(".quote_prev_cover") { choose('quote_prev_cover_false') } 仍然失败,使用相同的 Previous coverYesNois not included in the list .

如果被告知选择是 within(".quote_prev_cover") { choose('Yes') } ,它通过,几乎如果我还没有从 presence: 更改为 inclusion: ,我当然已经做了 .

来自firefox检查器的实际HTML:

<div class="form-group radio_buttons optional quote_prev_cover">
  <label class="control-label radio_buttons optional">Previous cover</label>
    <input name="quote[prev_cover]" value="" type="hidden">
        <span class="radio">
            <label for="quote_prev_cover_true">
                <input class="radio_buttons optional" value="true" name="quote[prev_cover]" id="quote_prev_cover_true" type="radio">Yes</label>
        </span>
        <span class="radio">
            <label for="quote_prev_cover_false">
                <input class="radio_buttons optional" readonly="readonly" value="false" name="quote[prev_cover]" id="quote_prev_cover_false" type="radio">No</label>
        </span>
    </div>

2 回答

  • 1

    这个报告有意义的唯一方法是,如果您选择了Yes或No,并且创建了相应的布尔值,那么您的语句“在实际手动浏览器中测试db记录是否正常” . 不是真的 .

    's because you'使用 validates_presence_of (通过验证在线状态:快捷方式)验证器,如果 false 是有效响应,则不能与布尔字段一起使用 . 来自 validates_presence_of 文档

    如果要验证是否存在布尔字段(实际值为true和false),则需要使用validates_inclusion_of:field_name,在:[true,false]中 . 这是由于Object#blank的方式?处理布尔值:false.blank? #=>是的 .

    因此,如果您从状态验证更改为

    validates :prev_cover, inclusion: { in: [true, false] }
    

    你的测试可能会通过 .

  • 0

    尝试创建引号记录导致Capybara测试失败的问题是它无法选择布尔单选按钮的No / false值,这是由于simple_form错误设置了 readonly="readonly" . 这个帖子提供了两种解决方案here

    1)在config / initializers / simple_form_bootstrap.rb中注释掉 :vertical_radio_and_checkboxes 包装器中的 b.optional :readonly .

    2)设置简单的表单参数如下:

    <%= f.input :prev_cover, as: :radio_buttons, collection: [['Yes', true], 
                            ['No', false]], readonly: nil %>
    

    虽然选项2仍然让Capybara在你进行测试时给你一个警告; Attempt to set readonly element with value: true * This will raise an exception in a future version of Capybara

    感谢#ThomasWalpole一路上帮助我和platformatec维护人员 .

相关问题