【问题标题】:Rspec/Capybara test post missing parameter from form but parameter is submmitted fine in dev when testing manuallyRspec/Capybara 测试后表单中缺少参数,但手动测试时参数在 dev 中提交得很好
【发布时间】:2019-03-23 21:18:44
【问题描述】:

我的一个测试是通过 javascript 创建一个表单帖子,它会从表单中删除第一个输入字段。因此,测试显然失败了。通过 binding.pry 进行调试时,看起来 js 帖子在将第一个参数 [address_by_user] 发布到我的路线时正在删除它。通过 localhost 中的 ui 进行测试时,此参数发布得很好,但不再适用于 rspec。知道是什么原因造成的吗?两天前测试通过了,表格没有改变。我尝试重新启动我的计算机,以防它是僵尸进程或被缓存的东西,但行为仍在继续。有什么想法吗?

使用以下代码通过 javascript 提交的表单:

          var form_id = "#form-step" + currentIndex; 
          var my_form = $(form_id);
          var url = $(form_id).attr('action');
          var form_data = my_form.serialize();
          console.log(form_data);
          var submission = $.post(url, form_data);

表单如下所示,点击向导中的“下一步”按钮后提交,效果很好。

<%= form_with(url:"add_property", scope: :property, class: "form", id:"form-step0") do |f| %>
      <div class="form-body" id="step0form">
      <h4 class="form-section"><i class="ft-location"></i> <%= t(:property_details) %></h4>
        <%= render 'shared/error_messages', object: f.object %>
        <div class="row">
          <div class="form-group pac-card col-md-8 offset-md-1 required" id='pac-card'> 
            <div class="field" id='pac-container'>
              <%= f.label :address_by_user, t(:address), class:"label-control" %>
              <%= f.text_field :address_by_user, :required => true, class: "form-control pac-input google-autocomplete", id:"pac-input" %>
            </div>
          </div>
          <div class="form-group form-row col-md-2">   
            <div class="field">
              <%= f.label :unit_number %>
              <%= f.text_field :unit_number, class: "form-control" %>
            </div>
          </div>
        </div>
        <div class="form-group form-row">   
          <div class="field col-md-2 offset-md-1">
            <%= f.label :bedrooms %>
            <%= f.number_field :bedrooms, :required => true, class: "form-control", in: 1...20 %>
          </div>
          <div class="field col-md-2 offset-md-1">
            <%= f.label :bathrooms %>
            <%= f.number_field :bathrooms, class: "form-control", in:1...10 %>
          </div>
          <div class="field col-md-2 offset-md-1">
            <%= f.label :accommodates %>
            <%= f.number_field :accommodates, class: "form-control", min: "0" %>
          </div>
        </div>
        <div class="form-group form-row">
          <div class="field col-md-2 offset-md-1"><%=label_tag(t(:property_type))%></div>
        </div>
        <div class="form-group form-row" data-toggle="buttons">
          <div class="btn-group col-md-12">
            <div class="field col-md-2 offset-md-1">
              <%= f.label :room_type, class: 'text-center btn btn-default active' do %>
                <%= image_tag('house-icon.png') %>
                <br>
                <%= f.radio_button :room_type, "entire_place", checked: true %>
                <span>Entire Place</span>
              <% end %>
            </div>
            <div class="field col-md-2 offset-md-1">
              <%= f.label :room_type, class: 'text-center btn btn-default' do %>
                <%= image_tag('room.png') %>
                </br>
                <%= f.radio_button :room_type, "private_room" %>
                <span>Private Room</span>
              <% end %>
            </div>
            <div class="field col-md-2 offset-md-1">
              <%= f.label :room_type, class: 'text-center btn btn-default' do %>
                <%= image_tag('people.png') %>
                </br>
                <%= f.radio_button :room_type, "shared_room" %>
                <span>Shared Room</span>
              <% end %>
            </div>
          </div>
        </div>
        <div id="hidden-fields">
          <%= f.hidden_field(:latitude, id: 'latitude') %>
          <%= f.hidden_field(:longitude, id: 'longitude') %>
          <%= f.hidden_field(:street_number, id: 'street_number') %>
          <%= f.hidden_field(:street_name, id: 'route') %>
          <%= f.hidden_field(:city, id: 'locality')%>
          <%= f.hidden_field(:state, id: 'administrative_area_level_1') %>
          <%= f.hidden_field(:country, id: 'country')%>     
        </div>
      </div>
    <% end %>

当通过本地主机直接从站点测试时,所有参数都可以正常发布,我得到了这个:(如预期的那样)

<ActionController::Parameters {"address_by_user"=>"Pura Uvita Vacation Home, Puntarenas Province, Uvita, Costa Rica", "unit_number"=>"", "bedrooms"=>"2", "bathrooms"=>"2.0", "accommodates"=>"6", "room_type"=>"entire_place", "latitude"=>"9.1839769", "longitude"=>"-83.72444630000001", "street_number"=>"", "street_name"=>"", "city"=>"Uvita", "state"=>"Provincia de Puntarenas", "country"=>"Costa Rica"} permitted: false>

在rspec流程中通过binding.pry获取参数时,结果如下:

<ActionController::Parameters {"unit_number"=>"", "bedrooms"=>"2", "bathrooms"=>"2", "accommodates"=>"6", "room_type"=>"entire_place", "latitude"=>"", "longitude"=>"", "street_number"=>"", "street_name"=>"", "city"=>"", "state"=>"", "country"=>""} permitted: false>

【问题讨论】:

    标签: ruby-on-rails forms post rspec capybara


    【解决方案1】:

    这两个最可能的原因是

    1. 这些字段实际上不再被填写 - 在测试运行时查看浏览器,查看表单是否实际填写正确。

    2. 您在另一个 JS 文件中存在错误,导致您认为正在处理表单的 JS 无法运行。发生这种情况是因为 JS 资产在测试环境中被串联,从而允许 JS 文件中出现错误以防止任何在其后串联的文件不被处理。

    【讨论】:

    • 表格正在填写中,查看控制台没有报错。多次重新启动和重新启动后,该错误已停止发生。但仍不清楚为什么会出现这种行为。
    • @Andrea 除了重新启动之外,还必须进行更改,可能在您的应用程序依赖的外部资源中(外部 JS、浏览器版本等)。
    • 是的,这就是我想可能发生的事情。这真的很奇怪。我仍然不知道是什么原因造成的,为什么开始或如何停止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多