HTTP機能テスト
機能テストでは、アプリケーションへの単一呼び出しの結果を確認できます。これは、単一のWebフォームの結果を返すこと、APIエンドポイントにアクセスすることなどを含みます。これは、単一のリクエストのライフサイクル全体をテストし、ルーティングが機能していること、レスポンスが正しい形式であること、結果を分析することなどを確認できるため便利です。
テストクラス
機能テストでは、すべてのテストクラスでCodeIgniter\Test\DatabaseTestTrait
とCodeIgniter\Test\FeatureTestTrait
トレイトを使用する必要があります。これらのテストツールは適切なデータベースステージングに依存しているため、独自のメソッドを実装する場合は、常にparent::setUp()
とparent::tearDown()
が呼び出されていることを確認する必要があります。
<?php
namespace App;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
class TestFoo extends CIUnitTestCase
{
use DatabaseTestTrait;
use FeatureTestTrait;
protected function setUp(): void
{
parent::setUp();
$this->myClassMethod();
}
protected function tearDown(): void
{
parent::tearDown();
$this->anotherClassMethod();
}
}
ページのリクエスト
基本的に、機能テストでは、アプリケーションのエンドポイントを呼び出して結果を取得できます。これを行うには、call()
メソッドを使用します。
最初の引数は使用するHTTPメソッドです(ほとんどの場合、GETまたはPOSTのいずれか)。
2番目の引数は、テストするサイト上のURIパスです。
3番目のパラメーター
$params
は、使用しているHTTP動詞のスーパーグローバル変数を設定するために使用される配列を受け取ります。そのため、**GET**メソッドでは**$_GET**変数が設定され、**POST**リクエストでは**$_POST**配列が設定されます。$params
はリクエストのフォーマットでも使用されます。注記
$params
配列は、すべてのHTTP動詞において意味を持つわけではありませんが、一貫性のために含まれています。
<?php
// Get a simple page
$result = $this->call('get', '/');
// Submit a form
$result = $this->call('post', 'contact', [
'name' => 'Fred Flintstone',
'email' => '[email protected]',
]);
省略記法メソッド
各HTTP動詞の省略記法メソッドは、入力の手間を省き、内容を明確にするために存在します。
<?php
$this->get($path, $params);
$this->post($path, $params);
$this->put($path, $params);
$this->patch($path, $params);
$this->delete($path, $params);
$this->options($path, $params);
異なるルートの設定
withRoutes()
メソッドに「ルート」の配列を渡すことで、カスタムのルートコレクションを使用できます。これにより、システム内の既存のルートは上書きされます。
<?php
$routes = [
['get', 'users', 'UserController::list'],
];
$result = $this->withRoutes($routes)->get('users');
各「ルート」は、HTTP動詞(またはすべての「add」)、一致させるURI、およびルーティング先を含む3要素の配列です。
セッション値の設定
withSession()
メソッドを使用して、単一のテスト中に使用するカスタムセッション値を設定できます。これは、このリクエストが行われたときに$_SESSION
変数内に存在する必要があるキー/値のペアの配列、または$_SESSION
の現在の値を使用することを示すnull
を取ります。これは、認証などのテストに便利です。
<?php
$values = [
'logged_in' => 123,
];
$result = $this->withSession($values)->get('admin');
// Or...
$_SESSION['logged_in'] = 123;
$result = $this->withSession()->get('admin');
ヘッダーの設定
withHeaders()
メソッドを使用してヘッダー値を設定できます。これは、呼び出しにヘッダーとして渡されるキー/値のペアの配列を受け取ります。
<?php
$headers = [
'CONTENT_TYPE' => 'application/json',
];
$result = $this->withHeaders($headers)->post('users');
イベントのバイパス
イベントはアプリケーションで使用すると便利ですが、テスト中は問題になる可能性があります。特に、メールを送信するために使用されるイベントです。skipEvents()
メソッドを使用して、イベント処理をスキップするようにシステムに指示できます。
<?php
$result = $this->skipEvents()->post('users', $userInfo);
リクエストのフォーマット
withBodyFormat()
メソッドを使用して、リクエストのボディの形式を設定できます。現在、これはjson
またはxml
をサポートしています。これは、JSONまたはXML APIをテストする場合に役立ち、コントローラーが期待する形式でリクエストを設定できます。
これにより、call()
、post()
、get()
などに渡されたパラメーターが、指定された形式のリクエストのボディに割り当てられます。
これにより、リクエストのContent-Typeヘッダーも適切に設定されます。
<?php
// If your feature test contains this:
$result = $this->withBodyFormat('json')->post('users', $userInfo);
// Your controller can then get the parameters passed in with:
$userInfo = $this->request->getJson();
ボディの設定
withBody()
メソッドを使用して、リクエストのボディを設定できます。これにより、ボディを任意の形式でフォーマットできます。複雑なXMLをテストする場合は、これを使用することをお勧めします。
これにより、Content-Typeヘッダーは設定されません。必要に応じて、withHeaders()
メソッドで設定できます。
レスポンスの確認
FeatureTestTrait::call()
は、TestResponse
のインスタンスを返します。レスポンスのテストで、このクラスを使用してテストケースで追加のアサーションと検証を実行する方法を参照してください。