【问题标题】:Capybara - how ignore form action url after for click_button?Capybara - click_button 之后如何忽略表单操作 url?
【发布时间】:2016-08-08 05:06:41
【问题描述】:

我有以下表格用于创建付款:

payments/_form.htmlerb

<div class="container">
  <div class="row-fluid">

    <%= form_tag  class: "form-horizontal", id: "payment-form" do %>
      <%= hidden_field_tag "CardRegistrationURL", card_reg['CardRegistrationURL'], id: "CardRegistrationURL" %>
      <%= hidden_field_tag "PreregistrationData", card_reg['PreregistrationData'], id: "PreregistrationData" %>
      <%= hidden_field_tag "AccessKey", card_reg['AccessKey'], id: "AccessKey" %>
      <%= hidden_field_tag "CardId", card_reg['Id'] %>
      <%= hidden_field_tag 'project_url', contract_path(@contract), id: "contractUrlHidden" %>
      <%= hidden_field_tag 'finialize_url', finialize_url, id: "finializeUrl" %>



      <fieldset>
        <div id="legend">
          <legend class="">Deposit for contract <%= @contract.title %></legend>
        </div>

        <div id="legend">
          <legend class="">Amount <%= @contract.amount %></legend>
        </div>

        <!-- Name -->
        <div class="control-group">
          <%= label "card_holder", "Card Holder's Name", class:"control-label" %>
          <div class="controls">
            <%= text_field_tag "card_holder", '', { id: "username", class: "input-xlarge"} %>
          </div>
        </div>

        <!-- Card Number -->
        <div class="control-group">
          <%= label "card_number", "Card number", class:"control-label" %>
          <div class="controls">
            <%= text_field_tag "Alias", '', { id: "card_number", class: "input-xlarge"} %>
          </div>
        </div>

        <!-- Expiry-->
        <div class="control-group">
          <%= label "expity_date", "Card Expiry Date", '', class:"control-label" %>
          <div class="controls">
            <%= text_field_tag "ExpirationDate", '', { id: "card_expiration_date", class: "input-xlarge"} %>
          </div>
        </div>

        <!-- CVV -->
        <div class="control-group">
          <%= label "cvv", "Card CVV", class:"control-label" %>
          <div class="controls">
            <%= text_field_tag "cardCvx", '', { id: "cardCvx", class: "input-xlarge"} %>
          </div>
        </div>

        <!-- Save card -->
        <div class="control-group">
          <div class="controls">
            <label class="checkbox" for="save_card">
              <%= label "save_card", class:"check_box" %>
              <input type="checkbox"> <!-- , '', id="save_card" value="option1"> //-->
              Save card on file?
            </label>
          </div>
        </div>

        <!-- Submit -->
        <div class="control-group">
          <div class="controls">
            <%= submit_tag "Pay now", {class: "btn btn-success", id: "process"} %>
          </div>
        </div>

      </fieldset>
    <% end %>
  </div>
</div>

register_card.coffee

jQuery ->
  $('#payment-form').submit (e) ->
    e.preventDefault()  
    $this = $(this)

    mangoPay.cardRegistration.init
      cardRegistrationURL: $("#CardRegistrationURL").val()
      preregistrationData: $("#PreregistrationData").val()
      accessKey: $("#AccessKey").val()

    cardData = {
      cardNumber: $("#card_number").val()
      cardExpirationDate: $("#card_expiration_date").val()
      cardCvx: $("#cardCvx").val()
    }
    contract_url =  $("#contractUrlHidden").val()
    finialize_url = $("#finializeUrl").val()
    mangoPay.cardRegistration.sendDataWithAjax(
      # URL to capture response
      finialize_url,
      # Card data
      cardData,
      # Result Ajax callback
      (data) ->
        $this.replaceWith('<p> Payment okay</p> </br> <div id="contract_url"><a href="">Return back to project</a></div>')
        $("#contract_url a").attr("href", contract_url)

        #doRedirect = -> window.location.href = data['url']
        #setTimeout doRedirect, 2000

      (xhr, status, error) -> 
        alert("Payment error : " + xhr.responseText + " (" + status + " - " + error + ")")

    )

    return false 

点击“立即付款”按钮后,将启动脚本 register_card.coffee。成功注册卡后查看付款/新将呈现新文本:感谢付款。如何测试这个正确?

我做以下事情:

expect(current_path).to eq(new_payment_path)
    expect(page).to have_text("Deposit for contract")
    fill_in "card_holder", with: "firstname lastname"
    fill_in "Alias", with: "4706750000000033"
    fill_in "ExpirationDate", with: "1017"
    click_button "Pay now"
    expect(current_path).to eq(new_payment_path)
    expect(page).to have_text("Return back to project")

但在行 click_button“立即付款”上显示错误。 失败/错误:click_button“立即付款” 动作控制器::路由错误: 没有路线匹配 [POST] "/payments/new"

我如何忽略 [POST] "/payments/new?因为所有数据都在脚本 register_card.coffee 中使用 ajax 发送。

【问题讨论】:

    标签: ruby-on-rails rspec coffeescript capybara


    【解决方案1】:

    您不能使用 capybara 测试 POST 请求。基本上,水豚是用来测试用户交互的,所以如果你手动执行测试表格中描述的步骤,你应该能够创建你想要的场景。您不应该检查路径是否是 [POST]new_payment_path,而是检查路径是否重定向到 GET 页面(我相信它将是索引或显示操作)。 另外,如果是ajax的话,应该在scenario子句中使用js:true参数;但是,为此您需要一个 javascript 驱动程序(我成功地将Poltergeist 用于此类场景)。

    【讨论】:

    • 谢谢。但是在我的情况下如何测试?我需要测试,点击“立即付款”后会在页面付款/新内容上呈现新内容,例如谢谢您的付款。
    • 我们先来了解一下。用户单击“立即付款”按钮进入 POST 操作。您不应该首先检查路径是否为 POST。如果您使用 flash 重定向用户,只需检查 flash 消息。如果您可以分享一些示例代码,我可以为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多