我有一个集成测试,我无法弄清楚为什么它没有通过。我觉得我的实现在我的控制器中按照我想要的方式工作,所有其他测试都通过了类似的编写。
integration test:
def setup
@user = users(:hank)
@user2 = users(:phillip)
@item = items(:television)
end
test "should decrement users tokens when ticket is purchased" do
log_in_as @user
assert_difference "@user.tokens", -(@item.ticket_price) do
post tickets_path, user_id: @user.id, item_id: @item.id, ticket_number: 15
end
end
^这是失败的部分,我把剩下的部分拿出来保持干净
tickets_controller.rb
def create
@ticket = Ticket.new(ticket_params)
user = current_user
item = Item.find(params[:item_id])
if user.tokens >= item.ticket_price
if @ticket.save
# If I debug here and after the upd_att the functionality works. Users tokens are in fact decremented.
user.update_attribute(:tokens, (user.tokens - item.ticket_price))
flash[:success] = "Ticket successfully purchased."
redirect_to item_path(@ticket.item_id)
else
flash[:danger] = "Ticket already purchased. Please select another."
redirect_to item_path(@ticket.item_id)
end
else
redirect_to item_path(item.id)
end
end
^我扩展了所有重构我的控制器的方法,希望能找到错误。
ticket's schema.rb
create_table "tickets", force: :cascade do |t|
t.integer "user_id"
t.integer "item_id"
t.integer "ticket_number", default: 0
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
该网站的基本功能是用户可以使用任意数量的代币购买门票。当用户购买票证时,它应该按照票证的价格递减用户令牌。这是我想要它在网站上的方式,我只是想测试它来构建我的套件。经过数百次绑定和搜索后,我不知道为什么当它从发布请求返回时,用户又回到了50个令牌(用户夹具中设置的数字)。如果我在控制器中放置一个调试器,用户的令牌会减少到40,但是如果我在assert_difference
结束之前将一个调试器放在post请求之后又回到了50。
编辑:
经过进一步测试后,我仍然无法使用它。如果我在测试中运行--verbose
标记,则会中止rake并返回
NameError: undefined local variable or method `√' for main:Object
我唯一能想到的是,如果我不小心使用了alt
+ space
并添加了不同的unicode空间。我重新输入控制器以确定,但这并没有解决问题。
我现在想的是,这可能是导致问题的形式。
show.html.haml
.purchase
= form_tag('/tickets') do
= hidden_field_tag 'user_id', @current_user.id if @current_user
= hidden_field_tag 'item_id', @item.id
= text_field_tag 'ticket_number', nil, placeholder: "Ticket Number"
= submit_tag 'Purchase'
我想知道是否是导致错误或UTF8编码的hidden_field_tags。我很难过。
答案 0 :(得分:1)
好的,经过长时间的痛苦搜索,我找到了答案。该属性需要在assert_difference中重新加载。
test "should decrement users tokens when ticket is purchased" do
log_in_as @user
assert_difference "@user.reload.tokens", -(@item.ticket_price) do
post tickets_path, user_id: @user.id, item_id: @item.id, ticket_number: 15
end
end
关键是“@ user.reload.tokens”
答案 1 :(得分:0)
只是看看会发生什么,我会尝试替换
recipies
与
user = current_user
在控制器中。