2013-07-12 7 views
0

내 cakePHP 2.0 앱에서 무언가를 테스트하는 동안 이상한 문제가 발생했습니다. 나는 앱이 지난 25 일 알림 전송이 이미있는 경우 확인하기 위해 데이터베이스를 조회하는 모델 내부의 기능이 : 나는 방법이 작동하는지 확인하려면 몇 가지 단위 테스트를하고 있어요cakePHP 실행 단위 테스트 관련 문제

public function checkIfNotified($userId){ 
    $query = 'SELECT count(`user_id`) AS notify '. 
     'FROM `churn_stats` '. 
     'WHERE `user_id` = '. $userId.' '. 
     'AND `notified` = 1 '. 
     'AND TIME_TO_SEC(TIMEDIFF(NOW(),`created`)) <= 2160000 '; 
     $this->log($query); 
    $result = $this->query($query); 
    return $result; 
} 

를, 그래서 '기록을 작성하고 너무 같은 사실 수익을 돌려 테스트하기 위해 노력하고있어 : (! 이미 행을 삽입 한 이후 잘못된 결과 인)

$data['notified'] = 1; 
$data['user_id'] = $userId; 
$this->ChurnStats->create(); 
$this->ChurnStats->save($data); 
$notified = $this->ChurnStats->checkIfNotified($userId); 
print_r($notified); 

를 결과 후 :

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [notify] => 0 
       ) 

     ) 

) 

Howev DB의 코드에서 생성 된 정확한 쿼리를 실행하면 결과는 다음과 같습니다. enter image description here

저는 이미 많은 시간을 낭비했습니다. 무엇이 잘못되었는지는 알지 못합니다.

+0

트랜잭션 격리? "* DB에서 코드에 의해 생성 된 정확한 쿼리를 실행할 때"삽입이 수행 된 것과 동일한 데이터베이스 세션에 있습니까? 그렇다면 삽입이 완료 되었습니까? 그렇다면 삽입 이전의 트랜잭션 내에서 PHP 세션이'REPEATABLE READ' 레벨로 격리되어 있습니까? – eggyal

+0

예, UnitTest가 온도를 지우지 않도록 코드가 실행 된 후 테스트 실행을 중단하는 동일한 데이터베이스 세션입니다. 테이블. 트랜잭션이 아니기 때문에 커밋 필요가 없습니다 (다른 테스트는 이와 같이 잘 작동하고 잘 동작합니다) 또한 $ this-> ChurnStats-> find ('all'); 방금 삽입 한 행을 반환합니다. 그러나 나는 그 수준에 대해 전혀 모른다. –

답변

0

모든 것을 테스트하고 확인한 후에 어떻게 든 다른 테스트 함수가 DB 또는 다음 테스트의 쿼리를 변경했지만 이상한 부분은 다른 쿼리가 동일한 쿼리를 호출했지만 삽입, 업데이트가 없었기 때문입니다 또는 삭제하여 다음 테스트의 결과 또는 환경을 수정할 수 있습니다.

모든 것을 모두 확인한 후 : Query Cache, 기본적으로 CakePHP는 모든 $ this-> query ("...")를 캐시합니다. 전화가 걸려 수정이 아주 쉬웠습니다. 비활성화하십시오!

$result = $this->query($query, false); 
관련 문제