2014-01-22 72 views
1

我正在開發一個PHP單元測試,我需要測試(同時需要100%的代碼覆蓋率)一個實現它自己的redirect($url, $code)方法的類。該方法最後調用exit;以確保在重定向之後沒有其他代碼執行(並且在沒有這個exit;重定向最後沒有完成...)。PHPUnit - 如何模擬/存根重定向方法?

現在這個重定向方法在7種不同的條件下被調用,它們都有自己的單元測試用例。如果我在exit;存在於被測試的類中運行單元測試,單元測試也會退出。

$this->assertRedirect(); 
$this->assertResponseStatusCode(401); 

因此我需要存根redirect方法,以便將其設置是在Location頭以及狀態代碼:每個測試用例的測試一樣的東西。

這裏就是我試圖做的(使用實施exit;部分重定向方法的內容 - 但它沒有明顯的工作):

$this->class = $this->getMockBuilder('Some\Name\Space\Class') 
      ->disableOriginalConstructor() 
      ->getMock(); 
    $this->class->expects($this->any()) 
      ->method('redirect') 
      ->will($this->returnCallback(function() { 
       $this->response->getHeaders()->addHeaderLine('Location: /'); 
       $this->response->setStatusCode(401); 
       $this->response->sendHeaders(); 
      })); 

什麼,我已經嘗試過(並且沒有工作如孔):

$this->class = $this->getMockBuilder('Some\Name\Space\Class') 
      ->disableOriginalConstructor() 
      ->getMock(); 
    $this->class->expects($this->any()) 
      ->method('redirect') 
      ->will($this->returnCallback(function() { 
       header('Location: /'); 
      })); 

現在類的目的是僅在一種情況下,以在代碼覆蓋率(90%某處重定向 - 2行出的90 - 它不是重定向),所以沒有可能向存根這個重定向(並且根本不可能測試重定向)測試案例對於這個班級來說幾乎沒有任何意義(這是不願意的)。

任何幫助,高度讚賞。

編輯:看起來像phpunit/test_helpers可以做的伎倆,但不幸的是,我不能夠安裝這個擴展我們的預覽和生產環境中的測試是自動按每個應用程序部署運行。

+0

從來沒有測試過它,但我搜索了assertRedirectTo並找到了它。 http://stackoverflow.com/questions/4240952/phpunit-and-zend-framework-assertredirectto-issue –

+0

@RoyalBg在這種情況下,應該如何提示*忽略失敗的重定向測試*或通常ZF1幫助我? – shadyyx

+1

有一個關於模擬和存根的評論,其中給出了鏈接,但我無法打開它,所以我的研究工作被阻止。 http://avnetlabs.com/zend-framework/tdd-with-zend-framework-mocks-and-stubs我認爲這可能會有所幫助。如果不是,請道歉。 –

回答

2

好的,我想出了問題:因爲應用程序是MVC體系結構,在調度過程中調用exit;是一種不好的方法。

取而代之的是,在響應標頭設置正確(爲了重定向)之後,我一直返回false直到它返回到分派過程。在這種情況下,我不需要再撥打exit;

這種情況下的單元測試運行平穩,無需進行任何更改(它在被測類中調用exit;之前執行)。