2013-07-12 174 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; 
} 

我正在做一些單元測試,以檢查方法的工作,所以我「M創造了記錄,並試圖對其進行測試返回還真像這樣:(!這是一個錯誤的結果,因爲我已經插入了行)

$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

經過測試和檢查一切後,它是另一個測試函數,以某種方式改變數據庫或下一個測試的查詢,但奇怪的部分是,其他測試稱爲相同的查詢,但沒有任何插入,更新或刪除可能會修改下一個測試的結果或環境的信息。在檢查所有內容後,所有內容都被簡化爲:查詢緩存,默認情況下,CakePHP緩存所有的$ this-> query(「...」);調用所以修復很容易:停用它!

$result = $this->query($query, false);