2015-02-11 113 views
0

我試圖單元測試一個ZF2應用程序。我有一個表格會根據是否適合學生或員工而略有變化,我有兩個獨立的工廠來生產它們。使用CSRF進行單元測試ZF2表單的問題

不管怎樣,我想在下面的測試來測試學生的形式:

public function testStudentFormAcceptsValidValues() 
{ 
    $this->getEmMock(); 
    $this->mockLogin('admin'); 

    $form = $this->serviceManager->get('student_form'); 
    $this->getApplicationServiceLocator()->setService('student_form', $form); 
    $url = '/user/account/add/student'; 
    $this->dispatch($url); 
    $csrf = $form->get('csrf')->getValue(); 

    $postData = $this->userStubData[1]; 
    $postData['csrf'] = $csrf; 
    $user = new UserEntity(); 

    $this->getApplicationServiceLocator()->setService('user_entity', $user); 

    $this->dispatch($url, 'POST', $postData); 

    $this->assertRedirectTo('/user#students'); 
    $this->assertEntityPropertiesSet($user, $postData); 
} 

當我運行這個測試,它傳遞。但是,我正在爲員工表單進行類似的測試,但由於CSRF標記錯誤會失敗。所以只是爲了踢球,我決定連續兩次運行上述測試來看看會發生什麼。它再次失敗了,原因完全一樣。

我終於決定檢查兩個測試的CSRF標記值,並且我發現它們都是相同的。出於某種原因,表單重新使用了先前測試中的CSRF值,而不是創建新的表單,並且表單因此拒絕了它。

爲了清除舊的CSRF值並獲得一個新的窗體將接受的信息,我需要做些什麼?

回答

0

我不知道你是如何配置你的測試的,但在測試之間很常見到bootstrap the application,所以你運行第二次測試時所有的服務都會重新初始化。

可能有些服務在第一次測試中初始化,第二次測試重複使用已初始化的服務和第一次測試中的「錯誤」舊值。

+0

這基本上是我用於測試的引導文件。我沒有寫下tearDown方法 - 有什麼我可以把它清理出來嗎? – blainarmstrong 2015-02-11 13:40:55