2012-11-20 43 views
0

我即將鑽研PHP世界中的測試,我有一些問題。我有一個處理貸款申請的控制器。然後將大部分工作委託給ProcessLoanApplication類。如何在Symfony中爲此編寫測試?

ApplyController

class ApplyController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
    $form = $this->createForm(new LoanApplication()); 

    if($request->getMethod() == 'POST') { 
     $form->bind($request); 

     if($form->isValid()) { 

      $session = $this->getRequest()->getSession(); 

      $loan_app_processor = new Tasks\ProcessLoanApplication($form, $session); 
      $loan_app_processor->process(); 

      return $this->redirect($this->generateUrl('apply_thanks')); 
     } 
    } 

任務\ ProcessLoanApplication

class ProcessLoanApplication 
{ 
    private $_QuickBaseModels; 
    private $_session; 
    private $_app; // submitted form data 
    private $_existingApp = false; // holds existing application in QB, if it exists 

    public function __construct(Form $form, Session $session) 
    { 
    $this->_app = $form->getNormData(); 
    $this->_session = $session; 

    // save the form data to a session 
    $session->set('application', $this->_app); 

    // create the quickbase table models objects 
    $this->_QuickBaseModels['GenFnHome\Application'] = new GenFnHome\Application(); 
    $this->_QuickBaseModels['GenFnHome\SSN'] = new GenFnHome\SSN(); 
    } 

    public function process() 
    { 
    $this->_existingApp = $this->_getExistingApplication(); 

    $app_status = $this->_existingApp[GenFnHome\SSN::LogInApplicationStatus]; 

    if(!$this->_existingApp || ($this->_existingApp && ($app_status !== 'PENDING' && $app_status !== 'OPEN' && $app_status !== 'EXPIRED'))) 
     return $this->_saveNewLoanApplication(); 

    if($app_status == 'EXPIRED') $this->_reOpenApplication(); 
    } 

有很多怎麼回事,所以我會先勾勒它:

  • 用戶發出請求爲應用程序
  • 申請表進行驗證
  • 如果有效,處理貸款申請
  • 檢查,如果用戶已經有一個應用程序,如果是這樣 - 做X,如果不是ÿ
  • 該應用程序是在「在線數據庫」堅持(QuickBase)我的應用程序通過HTTP上的XML通信(換句話說,沒有真正的DB)

我的問題給社會:

  • 這裏應該測試什麼?我知道這在很大程度上取決於我,但是社區可能會推薦一些應該寫入的基線測試。我應該測試控制器,處理器類和QuickBase類嗎?
  • 我的測試應該是彼此獨立的 - 也就是說,我應該單獨測試每個組件,而不是讓一個大型testApplication執行indexAction所做的所有操作,只查找預期的會話變量集。
  • 最後,一個測試API如何在沒有實際請求的情況下調用(請求/響應)(我正在使用PHPUnit)。
  • 還有什麼我應該知道的?

謝謝!

回答

0

對於控制器你應該使用功能測試(http://symfony.com/doc/2.0/book/testing.html#functional-tests)。藉助它們,您可以模擬瀏覽器和用戶的操作,例如提交表單和檢查驗證,數據庫更改,http狀態代碼等。

你不應該忘記單元測試ProcessLoanApplication。

我真的不知道爲什麼你將表單對象傳遞給ProcessLoanApplication。你應該通過實體 - 它已經有normdata了。

1

這裏應該測試什麼?我知道這在很大程度上取決於我,但是社區可能會推薦一些應該寫入的基線測試。我應該測試控制器,處理器類和QuickBase類嗎?

我建議測試你構建的每個類。如果您正在使用測試驅動開發,測試會聲明您正在構建的內容,而不測試任何代碼。

如果我的測試是相互獨立的 - 這意味着,我應該單獨測試每個組件,而不是有一個龐大的testApplication,做一切該做的indexAction,只是尋找那些被置預期的會話瓦爾?

每個單元測試應該被隔離,並且應該只測試您正在測試的類。如果一個對象依賴於另一個對象,則應該使用Mock對象(使用PHPunit模擬庫或其他第三方庫作爲Mockery)。

最後,一個測試API如何在沒有實際請求的情況下調用(請求/響應)(我正在使用PHPUnit)。

您可以使用它提供簡單的方法來模仿瀏覽器請求,詳細瞭解在the documentation中的Symfony的WebTestCase。我們稱之爲功能測試。

這通常是單元測試後的階段。在單元測試中,你將測試每個單獨的類(這是一個很好的練習unit test your controller),然後編寫功能測試,它結合了一切,並測試它是否像預期的那樣工作。