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