0

rspec で AJAX 更新ボタンをテストしたいのですが、正確な方法がわかりません。M. Hartl Tutorielを使用しましたが、うまくいきませんでした :

これが私のapp/views/products/buttons/_givable.html.erbです:

<div class="status_button givable_button" id="givable_button_<%=product.id%>">
  <% if product.givable? %>
    <%= form_for(product, remote: true) do |f| %>
      <div><%= f.hidden_field :givable, value: nil %></div>
      <%= f.submit t('product.givable.undo'), class: "btn btn-success btn-small" %>
    <% end %>
  <% else %>
    <%= form_for(product, remote: true) do |f| %>
      <div><%= f.hidden_field :givable, value: true %></div>
      <%= f.submit t('product.givable.do'), class: "btn btn-small" %>
    <% end %>
  <% end %>
</div>

ここに私のapp/controllers/product.rbがあります:

def update
  @product = Product.find(params[:id])
  @user = current_user
  if @product.update_attributes(product_params)
    respond_to do |format|
      format.html do
        flash[:success] = t('flash.success.product.update')
        redirect_to @product
      end
      format.js
    end
  else
    render 'edit'
  end
end

これが私のapp/views/products/update.js.erbです:

$("#givable_button_<%=@product.id%>").html("<%= escape_javascript(render('products/buttons/givable', product: @product)) %>")

そして、ここに私のテストがあります:

  describe "updating a product to unsharable with Ajax" do

    it "should increment the unsharable product count" do
      expect do
        xhr :patch, :update, id: product.id
      end.to change(Product.where(sharable: nil), :count).by(1)
    end

    it "should decrement the sharable product count" do
      expect do
        xhr :patch, :update, id: product.id
      end.to change(Product.where(sharable: true), :count).by(-1)
    end

  end

次に答え

Failure/Error: expect do
   count should have been changed by -1, but was changed by 0
4

1 に答える 1

0

2 番目の rpec の例に問題があったことは明らかです。

it "should decrement the sharable product count" do
  expect do
    xhr :patch, :update, id: product.id
  end.to change(Product.where(sharable: true), :count).by(-1)
end

それ以外の、

xhr :patch, :update, id: product.id

そうあるべきだと思いますが、

xhr :delete, :destroy, id: product.id

これを試して、何が起こるか見てください。

于 2013-09-23T08:58:29.877 に答える