2012-02-03 17 views
3

我正在爲我的核心庫更新單元測試,並且遇到了關於filelocks(flock)的場景,並且想知道其他人如何實現這些類型的單元測試。PHP - PHPUnit - 測試保護文件鎖的能力

基本上我有一個utlity文件類會寫內容到一個文件:

class CoreLib_Api_File_Package 
{ 
    public static function write(array $options) 
    { 
     ... 

     if (!$file->flock(LOCK_EX)) { 
      throw new CoreLib_Api_Exception('Unable to obtain lock on file'); 
     } 

     ... 
    } 
} 

而且我的單元測試的樣子:

public function testWriteException_UnableToSecureLock() 
{ 
    $this->touchFile($this->destFileUri); 

    $file = new SplFileObject($this->destFileUri, CoreLib_Api_File::MODE_WRITE); 

    $file->flock(LOCK_EX); 

    CoreLib_Api_File_Package::write(array('fileUri' => $this->destFileUri, 'content' => $this->testContent, 'mode' => CoreLib_Api_File::MODE_WRITE)); 
} 

你可以從測試代碼,我看在對write()方法進行API調用之前,對$this->destFileUri進行明確鎖定。我期望的是拋出異常throw new CoreLib_Api_Exception('Unable to obtain lock on file');。相反,我的單元測試只是無限期地掛起。

什麼是正確的方式來測試一個文件是否有鎖?

在此先感謝。

回答

3

您應該檢查this commentflockdocs page

本質上,flock將暫停執行,直到它能夠獲得鎖。看看下面的代碼,這是類似於您上面的情況:

$file = 'file.txt'; 

$first = fopen($file, "w"); 
flock($first, LOCK_EX); 

$second = fopen($file, "w"); 

# Your script will pause on the next line until timeout 
# due to the inability to obtain a lock. 
flock($second, LOCK_EX); 

但是,您可以得到非阻塞鎖是這樣的:

flock($file, LOCK_EX | LOCK_NB); 

我不知道是否有對鎖定的負面影響這樣的文件。另外,雖然文檔說LOCK_NB不適用於Windows,我只是測試它,它在我的機器上工作。所以,你可以做這樣的事情在你的CoreLib_Api_File_Package::write方法:

class CoreLib_Api_File_Package 
{ 
    public static function write(array $options) 
    { 
     if (! $file->flock(LOCK_EX | LOCK_NB)) 
     { 
      throw new CoreLib_Api_Exception('Unable to obtain lock on file'); 
     } 
    } 
} 

您當前的測試應該通過爲編寫。除此之外,我無法想到任何事情。

編輯:他們應該通過,只要你告訴PHPUnit期望的CoreLib_Api_Exception異常(只是指出來,因爲你沒有在你的例子)。

+0

感謝您的回覆。我也讀過那篇文章,只是好奇別人怎麼解決這個問題。我打算讓這個問題持續幾天,看看我能否得到其他答案,如果不能,我會接受這個問題。 – 2012-02-04 00:10:47

+0

劃痕,LOCK_NB工作正常。謝謝。 – 2012-02-04 00:17:12