Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当实现工作时,集成测试失败_Ruby On Rails_Ruby On Rails 4_Minitest - Fatal编程技术网

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