2011-02-01 3 views
3

하나의 계정을 가진 사용자에게 지불을 완료하는 테스트가 있습니다. 계정에 잔액이 포함되어 있으며 많은 거래가 있습니다.레일즈의 assert_difference가 일부 변경 사항을 무시합니까?

지불 완료시 트랜잭션이 생성되고 계정 잔액이 갱신됩니다.

변경 내용을 확인하기 위해 assert_difference를 사용하면 예상 한 결과가 나타납니다. 그러나 assert_difference를 사용하여 잔액이 변경되었는지 확인하지 않습니다. 내 로그에서 균형을 업데이트하는 SQL을 볼 수 있지만 변경되지 않았다고 주장합니다.

나는 완전히 혼란 스럽다. 누구든지 설명해 주실 수 있습니까?

미리 감사드립니다.

이 통과 :

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

이는 관련 :

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

이 주장에서 실패 messge은 다음과 같습니다 변화가없는 말이 실패

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

, 로그 파일의 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 출력을 두 번 받게됩니다. 그러나 지불을 처리 한 후에 잔액 만 출력하면 예상 된 300.0이됩니다. – Peter

답변

6

봅니다 a_user.account.balance 그것은 쿼리 이번이 처음 캐시지고 것 같다 기록

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

빙고, 당신은 스타입니다 !! 감사 :) – Peter

관련 문제