前回はincubatorUnitTestsな単体テストをしましたが、今回はFunctionalTestsの方でトライしてみます。
codeceptionのインストールは前回の記事を参照してください。

codeceptionの設定

Phalconアプリケーションを返すようなbootstrapファイルを作成する必要があります(_bootstrapとは別)。tests内にapi_boostrap.phpを以下の内容で作成してください。

APP_PATHはルートの_bootstrapファイルに定義しています。ここで定義したDIコンテナやアプリケーションがテスト内で利用されることになります。

APIのテスト

PhalconでAPIを作成する際のテスト方法を説明していきます。

まずは、以下のコマンドでsuiteを作成します。

tests/api.suite.ymlを以下のように書き換えます。

RESTのモジュールを使いつつも、Phalconのフレームワークでテストをする、という設定になります。

設定ファイルから実際のApiTesterクラスのビルドをする必要があります。ビルドしないと設定したモジュールが反映されません。

以下のコマンドでテストコードのひな形を作成します。

あとは、tests/api/{class_name}Cept.phpにコードを書いていけばOKです。以下はサンプル。

Webサイトのテスト

Webアプリ(サイト)の方法を説明します。

以下のようにしてsuiteを作成します。

tests/functional.suite.ymlはこんな感じで。

APIのときと同じように以下のコマンドでビルド

あとはテストコードを書くだけ。

tests/functional/{class_name}Cept.php

Phalconモジュールを利用する際の注意

Codeception\Module\RESTモジュールのsendGET, sendPOSTやCodeception\Lib\InnerBrowserCodeception\Module\Phalcon2の大元の継承クラス)のamOnPage等のメソッドでは$_SERVERの変数値を明示的に指定することができません。大抵この仕様が問題になることは無いとは思いますが、処理内で$_SERVER[‘REQUEST_TIME_FLOAT’]等のcodeceptionのモジュール内で暗黙的にセットされないヘッダ以外(HTTP_*変数)の変数を利用する場合、codeceptionを走らせた時に”Undefined index”のエラーが発生します。

これを回避するためには、Codeception\Lib\InnerBrowserに実装されている_requestメソッドを利用します。具体的には以下のようなコードをHelperクラス(tests/_support/Helper内のクラス)に実装します。

あとはcodecept buildしてから以下のようにして利用します。

HTTPヘッダをセットしたい場合は、ハイフンをアンダースコアに置換してアッパーケースにしてプレフィックスのHTTP_を付与してから、$serverに格納します。例えば、Authorizationヘッダの場合はHTTP_AUTHORIZATIONになります。

 

この投稿はPhalcon Advent Calendar 2015の 14日目の記事です。