0

PHPの世界でテストを掘り下げようとしていますが、いくつか質問があります。ローンの申し込みを処理するコントローラーがあります。次に、作業の大部分がProcessLoanApplicationクラスに委任されます。

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'));
        }
    }

Tasks \ 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を実行します。Yでない場合は実行します。
  • アプリケーションは、私のアプリケーションがXML over HTTPを介して通信する「オンラインデータベース」(QuickBase)に永続化されます(つまり、実際のデータベースはありません)

コミュニティへの私の質問:

  • ここで何をテストする必要がありますか?私はそれが主に私次第であることを知っています、しかしおそらくコミュニティはdefが書かれるべきであるいくつかのベースラインテストを推薦することができます。コントローラ、プロセッサクラス、およびQuickBaseクラスをテストする必要がありますか?
  • テストを互いに独立させる必要があります。つまり、indexActionが実行するすべてのことを実行し、設定される予想されるセッション変数を探すだけの1つの大規模なtestApplicationを用意するのではなく、各コンポーネントを個別にテストする必要がありますか?
  • 最後に、実際に実際のリクエストを行わずに、どのようにしてAPI呼び出し(リクエスト/レスポンス)をテストしますか(私はPHPUnitを使用しています)。
  • 他に知っておくべきことはありますか?

ありがとう!

4

2 に答える 2

1

ここで何をテストする必要がありますか?私はそれが主に私次第であることを知っていますが、おそらくコミュニティは、書くべきであるいくつかのベースラインテストを推奨することができます. コントローラ、プロセッサ クラス、および QuickBase クラスをテストする必要がありますか?

構築するすべてのクラスをテストすることをお勧めします。テスト駆動開発を使用している場合、テストは何を構築しているかを宣言します。テストはコードではありません。

私のテストは互いに独立している必要がありますか?つまり、indexAction が行うすべてのことを実行し、設定された予想されるセッション変数を探すだけの 1 つの大規模な testApplication を用意するのではなく、各コンポーネントを個別にテストする必要がありますか?

すべての単体テストは分離する必要があり、テストするクラスのみをテストする必要があります。あるオブジェクトが別のオブジェクトに依存している場合は、モック オブジェクトを使用する必要があります (PHPunit モック ライブラリまたは他のサードパーティ ライブラリを Mockery として使用します)。

最後に、実際のリクエストを行わずに API 呼び出し (リクエスト/レスポンス) をテストするにはどうすればよいでしょうか (私は PHPUnit を使用しています)。

WebTestCaseブラウザーのリクエストを模倣する簡単な方法を提供するSymfony を使用できます。詳細については、ドキュメントを参照してください。私たちはこれを機能テストと呼んでいます。

これは通常、単体テストの後の段階です。単体テストでは、個々のクラスをテストし ( controllerを単体テストすることをお勧めします)、その後、すべてを組み合わせた機能テストを記述し、期待どおりに機能するかどうかをテストします。

于 2012-11-20T19:05:29.223 に答える