2011-02-01 4 views
3

1つのアカウントを持つユーザーに支払いを完了させるテストがあります。口座には残高があり、多くの取引があります。Railsのassert_differenceはいくつかの変更を無視しますか?

お支払いが完了すると、トランザクションが作成され、アカウントの残高が更新されます。

トランザクションの数を確認するためにassert_differenceを使用すると、予想される結果が得られます。しかし、残高が変更されたことを確認するためにassert_differenceを使用することはできません。私は私のログのバランスを更新するSQLを見ることができますが、アサーションはそれが変更されていないと思っています。

私は完全に混乱しています、誰でも説明できますか?

ありがとうございます。

これは渡し:

assert_difference("a_user.account.transactions.count", 1) do 
    # Process payment 
end 

これが失敗し、変化がないと言って:

assert_difference("a_user.account.balance", 250.00) do 
    # Process payment 
end 

これは、アサーションから障害messgeです:

"a_user.account.balance" didn't change by 250.0. 
<300.0> expected but was 
<50.0>. 

これが関連していますログファイルからのSQL:

User Load (0.4ms) SELECT * FROM `users` WHERE (`users`.`id` = 108093344) 
    Account Load (0.2ms) SELECT * FROM `accounts` WHERE (`accounts`.user_id = 108093344) LIMIT 1 
    Transaction Columns (1.5ms) SHOW FIELDS FROM `transactions` 
    Transaction Create (0.3ms) INSERT INTO `transactions` (`created_at`, `updated_at`, `amount`, `account_id`, `detail`) VALUES('2011-02-01 17:15:21', '2011-02-01 17:15:21', 250.0, 956948796, 'Payment completed') 
    Account Load (0.2ms) SELECT * FROM `accounts` WHERE (`accounts`.`id` = 956948796) 
    Account Update (0.2ms) UPDATE `accounts` SET `updated_at` = '2011-02-01 17:15:21', `balance` = 300.0 WHERE `id` = 956948796 
+0

をリロードしてください。私がassert_differenceを取り除いて支払いを処理する前後に残高を出力すると、50.0の出力が2回取得されます。ただし、支払いを処理した後に残高のみを出力すると、予想される300.0が得られます。 – Peter

答えて

6

はa_user.account.balanceは、それが照会の初のキャッシュされつつあるように思えたレコード

assert_difference("a_user.account.reload.balance", 250.00) do 
    # Process payment 
end 
+0

ビンゴ、あなたはスターです!ありがとう:) – Peter

関連する問題