2016-07-08 8 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 

サイトの基本的な機能は、ユーザーが、彼らはチケットを購入するために使用できるトークンの任意の番号を持っています。ユーザーがチケットを購入すると、チケットの価格でユーザートークンを減らす必要があります。これは、私がサイト上でそれをしたいと思うように動作します、私はスイートを構築するためのテストをしたいだけです。 binding.pryと検索の何百もの後、私はポストリクエストから返ったときに、ユーザーが50トークン(ユーザーフィクスチャ内で設定された数)に戻るのがなぜわからないのですか?私は40に、コントローラにユーザーのトークンの減少をデバッガを置くが、私はassert_differenceの終了前に、POSTリクエストの後にデバッガを置けば、それは戻って50

編集するなら:更なるテストの後

Iそれでも、これを動作させることはできません。私はテストに--verboseタグを実行した場合、それは私が誤ってalt + spaceを使用し、異なるUnicodeのスペースを追加した場合、私は考えることができる唯一の事だった熊手を中止し

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

を返します。コントローラを再入力して確認しましたが、これで問題は解決しませんでした。

私は今、問題を引き起こしている私の形になると思っています。

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' 

エラーの原因となっているhidden_​​field_tagsか、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 = User.find(params[:user_id]) 

user = current_user 

を交換しようとするだろう。

+0

はまだ動作しませんです。 current_userは単に 'current_user = session [:user_id]'を設定したメソッドなので、これは実際にコードのロジックを変更するものではありません。 –

関連する問題