Ruby on rails 当实现工作时,集成测试失败
我有一个集成测试,我不知道为什么它没有通过。我觉得我的实现在我的控制器中以我想要的方式工作,并且我的所有其他测试都通过了,这些测试都是以类似的方式编写的Ruby on rails 当实现工作时,集成测试失败,ruby-on-rails,ruby-on-rails-4,minitest,Ruby On Rails,Ruby On Rails 4,Minitest,我有一个集成测试,我不知道为什么它没有通过。我觉得我的实现在我的控制器中以我想要的方式工作,并且我的所有其他测试都通过了,这些测试都是以类似的方式编写的 integration test: def setup @user = users(:hank) @user2 = users(:phillip) @item = items(:television) end test "should decrement users tokens when ticket is
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
该网站的基本功能是,用户可以使用任意数量的代币购买门票。当用户购买票证时,应按票证价格减少用户代币。这是我希望它在网站上运行的方式,我只想对它进行测试以构建我的套件。经过数百次的binding.pry和搜索,我不知道为什么当它从post请求返回时,用户返回到拥有50个令牌(用户装置中设置的数字)。如果我在控制器中放置调试器,用户的令牌将减少到40,但是如果我在post请求之后assert\u difference
结束之前放置调试器,则返回到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'
我想知道是隐藏的\u字段\u标记导致了错误,还是UTF8编码。我被难住了。为了看看会发生什么,我会尝试替换
user = current_user
与
在控制器中 好吧,经过长时间痛苦的搜索,我找到了答案。需要在assert_差异中重新加载该属性
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”仍然不起作用。无论如何,这并没有真正改变代码中的逻辑,因为当前用户只是我设置的一个方法
current\u user=session[:user\u id]
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