2016-07-08 3 views
2

У меня есть интеграционный тест, который я не могу понять, почему он не проходит. Я чувствую, что моя реализация работает так, как я хочу, в моих контроллерах, и все мои другие тесты проходят, которые написаны несколько аналогично.Ошибка интеграции при выполнении работ

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 

Основная функциональность сайта - пользователь имеет любое количество токенов, которые они могут использовать для покупки билетов. Когда пользователь покупает билет, он должен уменьшать токены пользователей по цене билета. Это работает так, как я хочу, чтобы это было на сайте, я просто хочу пройти тест на его сборку своего пакета. После сотен bind.pry и поиска я не знаю, почему, когда он возвращается из почтового запроса, пользователь возвращается к 50 токенам (число, установленное в пользовательском приборе). Если я ставлю отладчик в контроллере маркеров уменьшения пользователя до 40, но если я ставлю отладчик после запроса поста до конца assert_difference он вернулся к 50.

EDIT:

После дальнейшего тестирования I все еще не может заставить это работать. Если я бег --verbose тега на тесте она ликвидирует грабли и возвращает

NameError: undefined local variable or method `√' for main:Object 

Единственным, что я мог думать, если бы я случайно использовал alt + space и добавил другой Юникод пространства. Я вернул контроллер, чтобы быть уверенным, и это не решило проблему.

Теперь я думаю, что это может быть моя форма, которая вызывает проблемы.

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. Я в тупике.

ответ

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

0

Просто чтобы посмотреть, что происходит, я хотел бы попробовать заменить

user = current_user 

с

user = User.find(params[:user_id]) 

в контроллере.

+0

Тем не менее не работает. Это никак не изменяет логику кода, так как current_user - это всего лишь метод, который я установил параметр current_user = session [: user_id] ' –

Смежные вопросы