使用Rspec测试AJAX:此代码有效但规范无法找到路由

oka*_*56k 0 javascript ruby ajax rspec ruby-on-rails

我在页面中有这个Javascript:

<script type='text/javascript'>
  function update_price(order_id, quantity) {
    $.ajax({
      beforeSend: function(xhr) {
        xhr.setRequestHeader(
          'X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
      },
      url: "/carts/" + <%= @cart.id %> + "/update_quantity", #you are missing 's' here is this a typo?
      type: "POST",
      data: {
        "order_id" : order_id,
        "quantity" : quantity }
    });
  }
</script>
Run Code Online (Sandbox Code Playgroud)

它适用于用户.匹配的路由如下所示:

resources :carts, only: %i[update destroy index] do
  member do
    match 'update_quantity', to: 'carts#update_quantity', via: %i[get post]
  end
end
Run Code Online (Sandbox Code Playgroud)

我的规格看起来像这样:

it 'updates the quantity' do
  post "/cart/#{cart.id}/update_quantity", xhr: true, params: {
    order_id: cart.orders.first.id,
    quantity: 50
  }
  expect(response.status).to eq 200
end
Run Code Online (Sandbox Code Playgroud)

但我一直收到这个错误:

ActionController::UrlGenerationError:
   No route matches {:action=>"/cart/2/update_quantity", :controller=>"carts", :order_id=>1, :quantity=>50}
Run Code Online (Sandbox Code Playgroud)

简而言之,它适用于用户,但我无法通过规范.我究竟做错了什么?

Mar*_*sky 8

在rails 4 xhr规格中得到了相同的错误.这种格式适合我:

xhr :post, :update_quantity, id: cart.id, order_id: cart.orders.first.id, quantity: 50
Run Code Online (Sandbox Code Playgroud)

看起来你有rails 5 app所以试试这个:

post :update_quantity, xhr: true, params: {
  id: cart.id,
  order_id: cart.orders.first.id,
  quantity: 50
}
Run Code Online (Sandbox Code Playgroud)

请注意,xhr在rails 5中不推荐使用该方法,因此请使用optionxhr: true