HTTP機能テスト

機能テストでは、アプリケーションへの単一呼び出しの結果を確認できます。これは、単一のWebフォームの結果を返すこと、APIエンドポイントにアクセスすることなどを含みます。これは、単一のリクエストのライフサイクル全体をテストし、ルーティングが機能していること、レスポンスが正しい形式であること、結果を分析することなどを確認できるため便利です。

テストクラス

機能テストでは、すべてのテストクラスでCodeIgniter\Test\DatabaseTestTraitCodeIgniter\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()メソッドを使用します。

  1. 最初の引数は使用するHTTPメソッドです(ほとんどの場合、GETまたはPOSTのいずれか)。

  2. 2番目の引数は、テストするサイト上のURIパスです。

  3. 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のインスタンスを返します。レスポンスのテストで、このクラスを使用してテストケースで追加のアサーションと検証を実行する方法を参照してください。