实施工作时集成测试失败

时间:2016-07-08 07:06:41

标签: 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 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。我很难过。

2 个答案:

答案 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

在控制器中。