Testing

Whenever you write a new line of code, you also potentially add new bugs. To build better and more reliable applications, you should test your code using both functional and unit tests.

新しいコード行を作成するたびに、新しいバグが追加される可能性もあります。より優れた信頼性の高いアプリケーションを構築するには、機能テストと単体テストの両方を使用してコードをテストする必要があります。

The PHPUnit Testing Framework

Symfony integrates with an independent library called PHPUnit to give you a rich testing framework. This article won't cover PHPUnit itself, which has its own excellent documentation.

Symfony は、PHPUnit と呼ばれる独立したライブラリと統合して、豊富なテスト フレームワークを提供します。この記事では、独自の優れたドキュメントがある PHPUnit 自体については説明しません。

Before creating your first test, install symfony/test-pack, which installs some other packages needed for testing (such as phpunit/phpunit):

最初のテストを作成する前に、テストに必要な他のパッケージ (phpunit/phpunit など) をインストールする symfony/test-pack をインストールします。
1
$ composer require --dev symfony/test-pack

After the library is installed, try running PHPUnit:

ライブラリをインストールしたら、PHPUnit を実行してみてください。
1
$ php bin/phpunit

This command automatically runs your application tests. Each test is a PHP class ending with "Test" (e.g. BlogControllerTest) that lives in the tests/ directory of your application.

このコマンドは、アプリケーション テストを自動的に実行します。各テストは、"Test" で終わる PHP クラス (例: BlogControllerTest) で、アプリケーションの tests/ ディレクトリにあります。

PHPUnit is configured by the phpunit.xml.dist file in the root of your application. The default configuration provided by Symfony Flex will be enough in most cases. Read the PHPUnit documentation to discover all possible configuration options (e.g. to enable code coverage or to split your test into multiple "test suites").

PHPUnit は、アプリケーションのルートにある phpunit.xml.dist ファイルによって構成されます。ほとんどの場合、Symfony Flex が提供するデフォルト設定で十分です。 PHPUnit のドキュメントを読んで、可能なすべての構成オプションを見つけてください (たとえば、コード カバレッジを有効にしたり、テストを複数の「テスト スイート」に分割したりするなど)。

Note

ノート

Symfony Flex automatically creates phpunit.xml.dist and tests/bootstrap.php. If these files are missing, you can try running the recipe again using composer recipes:install phpunit/phpunit --force -v.

Symfony Flex は自動的に phpunit.xml.dist と tests/bootstrap.php を作成します。これらのファイルが見つからない場合は、composer レシピを使用してレシピを再度実行してみてください:phpunit/phpunit --force -v をインストールします。

Types of Tests

There are many types of automated tests and precise definitions often differ from project to project. In Symfony, the following definitions are used. If you have learned something different, that is not necessarily wrong, just different from what the Symfony documentation is using.

自動化されたテストには多くの種類があり、正確な定義はプロジェクトごとに異なることがよくあります。 Symfony では、次の定義が使用されます。何か違うことを学んだとしても、それは必ずしも間違っているわけではなく、単に Symfony のドキュメントが使用しているものとは異なるだけです。
Unit Tests
These tests ensure that individual units of source code (e.g. a single class) behave as intended.
これらのテストにより、ソース コードの個々のユニット (単一クラスなど) が意図したとおりに動作することが保証されます。
Integration Tests
These tests test a combination of classes and commonly interact with Symfony's service container. These tests do not yet cover the fully working application, those are called Application tests.
これらのテストは、クラスの組み合わせをテストし、一般的に Symfony のサービス コンテナーとやり取りします。これらのテストはまだ完全に機能するアプリケーションをカバーしていません。これらはアプリケーション テストと呼ばれます。
Application Tests
Application tests test the behavior of a complete application. They make HTTP requests (both real and simulated ones) and test that the response is as expected.
アプリケーション テストは、完全なアプリケーションの動作をテストします。 HTTP 要求 (実際の要求とシミュレートされた要求の両方) を作成し、応答が期待どおりであることをテストします。

Unit Tests

A unit test ensures that individual units of source code (e.g. a single class or some specific method in some class) meet their design and behave as intended. Writing unit tests in a Symfony application is no different from writing standard PHPUnit unit tests. You can learn about it in the PHPUnit documentation: Writing Tests for PHPUnit.

単体テストは、ソース コードの個々の単位 (たとえば、単一のクラスまたは一部のクラスの特定のメソッド) が設計を満たし、意図したとおりに動作することを保証します。 Symfony アプリケーションで単体テストを作成することは、標準の PHPUnit 単体テストを作成することと同じです。これについては、PHPUnit のドキュメント: PHPUnit のテストの記述で学習できます。

By convention, the tests/ directory should replicate the directory of your application for unit tests. So, if you're testing a class in the src/Form/ directory, put the test in the tests/Form/ directory. Autoloading is automatically enabled via the vendor/autoload.php file (as configured by default in the phpunit.xml.dist file).

慣例により、tests/ ディレクトリは単体テスト用のアプリケーションのディレクトリを複製する必要があります。そのため、src/Form/ ディレクトリでクラスをテストする場合は、tests/Form/ ディレクトリにテストを配置します。自動ロードは vendor/autoload.php ファイルを介して自動的に有効になります (phpunit.xml. dist ファイル)。

You can run tests using the bin/phpunit command:

bin/phpunit コマンドを使用してテストを実行できます。
1
2
3
4
5
6
7
8
# run all tests of the application
$ php bin/phpunit

# run all tests in the Form/ directory
$ php bin/phpunit tests/Form

# run tests for the UserType class
$ php bin/phpunit tests/Form/UserTypeTest.php

Tip

ヒント

In large test suites, it can make sense to create subdirectories for each type of tests (e.g. tests/Unit/ and tests/Functional/).

大規模なテスト スイートでは、テストの種類ごとにサブディレクトリを作成することが理にかなっています (例: tests/Unit/ および tests/Functional/)。

Integration Tests

An integration test will test a larger part of your application compared to a unit test (e.g. a combination of services). Integration tests might want to use the Symfony Kernel to fetch a service from the dependency injection container.

統合テストは、単体テスト (サービスの組み合わせなど) と比較して、アプリケーションの大部分をテストします。統合テストでは、Symfony Kernel を使用して、依存性注入コンテナーからサービスを取得する必要がある場合があります。

Symfony provides a KernelTestCase class to help you creating and booting the kernel in your tests using bootKernel():

Symfony は、bootKernel() を使用してテストでカーネルを作成および起動するのに役立つ KernelTestCase クラスを提供します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// tests/Service/NewsletterGeneratorTest.php
namespace App\Tests\Service;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class NewsletterGeneratorTest extends KernelTestCase
{
    public function testSomething()
    {
        self::bootKernel();

        // ...
    }
}

The KernelTestCase also makes sure your kernel is rebooted for each test. This assures that each test is run independently from each other.

KernelTestCase は、テストごとにカーネルが再起動されることも確認します。これにより、各テストが互いに独立して実行されることが保証されます。

To run your application tests, the KernelTestCase class needs to find the application kernel to initialize. The kernel class is usually defined in the KERNEL_CLASS environment variable (included in the default .env.test file provided by Symfony Flex):

アプリケーション テストを実行するには、KernelTestCase クラスが初期化するアプリケーション カーネルを見つける必要があります。カーネルクラスは通常、KERNEL_CLASS 環境変数で定義されます (Symfony Flex が提供するデフォルトの .env.test ファイルに含まれています):
1
2
# .env.test
KERNEL_CLASS=App\Kernel

Note

ノート

If your use case is more complex, you can also override the getKernelClass() or createKernel() methods of your functional test, which takes precedence over the KERNEL_CLASS env var.

ユース ケースがより複雑な場合は、機能テストの getKernelClass() または createKernel() メソッドをオーバーライドすることもできます。これは、KERNEL_CLASS 環境変数よりも優先されます。

Set-up your Test Environment

The tests create a kernel that runs in the test environment. This allows to have special settings for your tests inside config/packages/test/.

テストは、テスト環境で実行されるカーネルを作成します。これにより、config/packages/test/ 内でテスト用の特別な設定を行うことができます。

If you have Symfony Flex installed, some packages already installed some useful test configuration. For example, by default, the Twig bundle is configured to be especially strict to catch errors before deploying your code to production:

Symfony Flex がインストールされている場合、一部のパッケージはすでにいくつかの有用なテスト構成をインストールしています。たとえば、デフォルトでは、Twig バンドルは、コードを本番環境にデプロイする前にエラーをキャッチするように特に厳密に構成されています。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
# config/packages/test/twig.yaml
twig:
    strict_variables: true

You can also use a different environment entirely, or override the default debug mode (true) by passing each as options to the bootKernel() method:

別の環境を完全に使用することも、bootKernel() メソッドにオプションとしてそれぞれを渡すことで、defaultdebug モード (true) をオーバーライドすることもできます。
1
2
3
4
self::bootKernel([
    'environment' => 'my_test_env',
    'debug'       => false,
]);

Tip

ヒント

It is recommended to run your test with debug set to false on your CI server, as it significantly improves test performance. This disables clearing the cache. If your tests don't run in a clean environment each time, you have to manually clear it using for instance this code in tests/bootstrap.php:

テストのパフォーマンスが大幅に向上するため、CI サーバーでデバッグを false に設定してテストを実行することをお勧めします。これにより、キャッシュのクリアが無効になります。テストが毎回クリーンな環境で実行されない場合は、tests/bootstrap.php 内のたとえば次のコードを使用して、手動でクリアする必要があります。
1
2
3
4
// ...

// ensure a fresh cache when debug mode is disabled
(new \Symfony\Component\Filesystem\Filesystem())->remove(__DIR__.'/../var/cache/test');

Customizing Environment Variables

If you need to customize some environment variables for your tests (e.g. the DATABASE_URL used by Doctrine), you can do that by overriding anything you need in your .env.test file:

テスト用にいくつかの環境変数をカスタマイズする必要がある場合 (Doctrine で使用される DATABASE_URL など)、.env.test ファイルで必要なものをオーバーライドすることでそれを行うことができます:
1
2
3
4
# .env.test

# ...
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name_test?serverVersion=5.7"

In the test environment, these env files are read (if vars are duplicated in them, files lower in the list override previous items):

テスト環境では、これらの env ファイルが読み込まれます (変数が重複している場合、リストの下位にあるファイルが前の項目を上書きします)。
  1. .env: containing env vars with application defaults;
    .env: アプリケーションのデフォルトの環境変数を含みます。
  2. .env.test: overriding/setting specific test values or vars;
    .env.test: 特定のテスト値または変数のオーバーライド/設定。
  3. .env.test.local: overriding settings specific for this machine.
    .env.test.local: このマシンに固有の設定をオーバーライドします。

Caution

注意

The .env.local file is not used in the test environment, to make each test set-up as consistent as possible.

.env.local ファイルはテスト環境では使用されません。これは、各テスト セットアップを可能な限り一貫性のあるものにするためです。

Retrieving Services in the Test

In your integration tests, you often need to fetch the service from the service container to call a specific method. After booting the kernel, the container is returned by static::getContainer():

統合テストでは、特定のメソッドを呼び出すために、サービス コンテナーからサービスをフェッチする必要があることがよくあります。カーネルの起動後、コンテナーは static::getContainer() によって返されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// tests/Service/NewsletterGeneratorTest.php
namespace App\Tests\Service;

use App\Service\NewsletterGenerator;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class NewsletterGeneratorTest extends KernelTestCase
{
    public function testSomething()
    {
        // (1) boot the Symfony kernel
        self::bootKernel();

        // (2) use static::getContainer() to access the service container
        $container = static::getContainer();

        // (3) run some service & test the result
        $newsletterGenerator = $container->get(NewsletterGenerator::class);
        $newsletter = $newsletterGenerator->generateMonthlyNews(/* ... */);

        $this->assertEquals('...', $newsletter->getContent());
    }
}

The container from static::getContainer() is actually a special test container. It gives you access to both the public services and the non-removed private services.

static::getContainer() のコンテナーは、実際には特別なテスト コンテナーです。これにより、パブリック サービスと削除されていないプライベート サービスの両方にアクセスできます。

Note

ノート

If you need to test private services that have been removed (those who are not used by any other services), you need to declare those private services as public in the config/services_test.yaml file.

削除されたプライベート サービス (他のサービスで使用されていないサービス) をテストする必要がある場合は、それらのプライベート サービスを config/services_test.yaml ファイルでパブリックとして宣言する必要があります。

Mocking Dependencies

Sometimes it can be useful to mock a dependency of a tested service. From the example in the previous section, let's assume the NewsletterGenerator has a dependency to a private alias NewsRepositoryInterface pointing to a private NewsRepository service and you'd like to use a mocked NewsRepositoryInterface instead of the concrete one:

テスト済みのサービスの依存関係をモック化すると便利な場合があります。前のセクションの例から、NewsletterGenerator がプライベート NewsRepository サービスを指すプライベート エイリアスNewsRepositoryInterface への依存関係を持ち、コンクリートの代わりにモック化された NewsRepositoryInterface を使用したいとします。 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// ...
use App\Contracts\Repository\NewsRepositoryInterface;

class NewsletterGeneratorTest extends KernelTestCase
{
    public function testSomething()
    {
        // ... same bootstrap as the section above

        $newsRepository = $this->createMock(NewsRepositoryInterface::class);
        $newsRepository->expects(self::once())
            ->method('findNewsFromLastMonth')
            ->willReturn([
                new News('some news'),
                new News('some other news'),
            ])
        ;

        // the following line won't work unless the alias is made public
        $container->set(NewsRepositoryInterface::class, $newsRepository);

        // will be injected the mocked repository
        $newsletterGenerator = $container->get(NewsletterGenerator::class);

        // ...
    }
}

In order to make the alias public, you will need to update configuration for the test environment as follows:

エイリアスを公開するには、次のようにテスト環境の構成を更新する必要があります。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
# config/services_test.yaml
services:
    # redefine the alias as it should be while making it public
    App\Contracts\Repository\NewsRepositoryInterface:
        alias: App\Repository\NewsRepository
        public: true

Configuring a Database for Tests

Tests that interact with the database should use their own separate database to not mess with the databases used in the other configuration environments.

データベースと対話するテストでは、他の構成環境で使用されるデータベースを混乱させないように、独自の別個のデータベースを使用する必要があります。

To do that, edit or create the .env.test.local file at the root directory of your project and define the new value for the DATABASE_URL env var:

これを行うには、プロジェクトのルート ディレクトリにある .env.test.local ファイルを編集または作成し、DATABASE_URLenv 変数の新しい値を定義します。
1
2
# .env.test.local
DATABASE_URL="mysql://USERNAME:PASSWORD@127.0.0.1:3306/DB_NAME?serverVersion=5.7"

This assumes that each developer/machine uses a different database for the tests. If the test set-up is the same on each machine, use the .env.test file instead and commit it to the shared repository. Learn more about using multiple .env files in Symfony applications.

これは、各開発者/マシンがテストに異なるデータベースを使用することを前提としています。テストのセットアップが各マシンで同じである場合は、代わりに .env.testfile を使用して共有リポジトリにコミットします。 Symfony アプリケーションで複数の .env ファイルを使用する方法について学んでください。

After that, you can create the test database and all tables using:

その後、次を使用してテスト データベースとすべてのテーブルを作成できます。
1
2
3
4
5
# create the test database
$ php bin/console --env=test doctrine:database:create

# create the tables/columns in the test database
$ php bin/console --env=test doctrine:schema:create

Tip

ヒント

A common practice is to append the _test suffix to the original database names in tests. If the database name in production is called project_acme the name of the testing database could be project_acme_test.

一般的な方法は、テストで元のデータベース名に _test サフィックスを追加することです。本番環境のデータベース名が project_acme である場合、テスト データベースの名前は project_acme_test になります。

Resetting the Database Automatically Before each Test

Tests should be independent from each other to avoid side effects. For example, if some test modifies the database (by adding or removing an entity) it could change the results of other tests.

副作用を避けるために、テストは互いに独立している必要があります。たとえば、一部のテストで (エンティティの追加または削除によって) データベースが変更された場合、他のテストの結果が変更される可能性があります。

The DAMADoctrineTestBundle uses Doctrine transactions to let each test interact with an unmodified database. Install it using:

DAMADoctrineTestBundle は Doctrine トランザクションを使用して、各テストが変更されていないデータベースとやり取りできるようにします。次を使用してインストールします。
1
$ composer require --dev dama/doctrine-test-bundle

Now, enable it as a PHPUnit extension:

次に、PHPUnit 拡張機能として有効にします。
1
2
3
4
5
6
7
8
<!-- phpunit.xml.dist -->
<phpunit>
    <!-- ... -->

    <extensions>
        <extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension"/>
    </extensions>
</phpunit>

That's it! This bundle uses a clever trick: it begins a database transaction before every test and rolls it back automatically after the test finishes to undo all changes. Read more in the documentation of the DAMADoctrineTestBundle.

それでおしまい!このバンドルは巧妙なトリックを使用しています。すべてのテストの前にデータベース トランザクションを開始し、テストが終了すると自動的にロールバックして、すべての変更を元に戻します。詳細については、DAMADoctrineTestBundle のドキュメントを参照してください。

Load Dummy Data Fixtures

Instead of using the real data from the production database, it's common to use fake or dummy data in the test database. This is usually called "fixtures data" and Doctrine provides a library to create and load them. Install it with:

本番データベースの実際のデータを使用する代わりに、テスト データベースで偽のデータまたはダミー データを使用するのが一般的です。これは通常「フィクスチャ データ」と呼ばれ、Doctrine はそれらを作成してロードするためのライブラリを提供します。
1
$ composer require --dev doctrine/doctrine-fixtures-bundle

Then, use the make:fixtures command of the SymfonyMakerBundle to generate an empty fixture class:

次に、SymfonyMakerBundle の make:fixtures コマンドを使用して、空のフィクスチャ クラスを生成します。
1
2
3
4
$ php bin/console make:fixtures

The class name of the fixtures to create (e.g. AppFixtures):
> ProductFixture

Then you modify and use this class to load new entities in the database. For instance, to load Product objects into Doctrine, use:

次に、このクラスを変更して使用し、データベースに新しいエンティティをロードします。たとえば、Product オブジェクトを Doctrine にロードするには、次を使用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// src/DataFixtures/ProductFixture.php
namespace App\DataFixtures;

use App\Entity\Product;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class ProductFixture extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $product = new Product();
        $product->setName('Priceless widget');
        $product->setPrice(14.50);
        $product->setDescription('Ok, I guess it *does* have a price');
        $manager->persist($product);

        // add more products

        $manager->flush();
    }
}

Empty the database and reload all the fixture classes with:

データベースを空にして、すべてのフィクスチャ クラスを次のようにリロードします。
1
$ php bin/console --env=test doctrine:fixtures:load

For more information, read the DoctrineFixturesBundle documentation.

詳細については、DoctrineFixturesBundle のドキュメントを参照してください。

Application Tests

Application tests check the integration of all the different layers of the application (from the routing to the views). They are no different from unit tests or integration tests as far as PHPUnit is concerned, but they have a very specific workflow:

アプリケーション テストでは、アプリケーションのすべての異なるレイヤー (ルーティングからビューまで) の統合をチェックします。 PHPUnit に関する限り、単体テストや統合テストと違いはありませんが、非常に特殊なワークフローがあります。
  1. Make a request;
    リクエストを行います。
  2. Interact with the page (e.g. click on a link or submit a form);
    ページを操作する (リンクをクリックする、フォームを送信するなど)。
  3. Test the response;
    応答をテストします。
  4. Rinse and repeat.
    すすいで繰り返します。

Note

ノート

The tools used in this section can be installed via the symfony/test-pack, use composer require symfony/test-pack if you haven't done so already.

このセクションで使用するツールは、symfony/test-pack を介してインストールできます。まだ行っていない場合は composer require symfony/test-pack を使用してください。

Write Your First Application Test

Application tests are PHP files that typically live in the tests/Controller/ directory of your application. They often extend WebTestCase. This class adds special logic on top of the KernelTestCase. You can read more about that in the above section on integration tests.

アプリケーション テストは、通常、アプリケーションの tests/Controller/ ディレクトリに存在する PHP ファイルです。多くの場合、WebTestCase を拡張します。このクラスは、KernelTestCase の上に特別なロジックを追加します。詳細については、統合テストに関する上記のセクションを参照してください。

If you want to test the pages handled by your PostController class, start by creating a new PostControllerTest using the make:test command of the SymfonyMakerBundle:

PostController クラスによって処理されるページをテストする場合は、SymfonyMakerBundle の make:test コマンドを使用して新しい PostControllerTest を作成することから始めます。
1
2
3
4
5
6
7
$ php bin/console make:test

 Which test type would you like?:
 > WebTestCase

 The name of the test class (e.g. BlogPostTest):
 > Controller\PostControllerTest

This creates the following test class:

これにより、次のテスト クラスが作成されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// tests/Controller/PostControllerTest.php
namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class PostControllerTest extends WebTestCase
{
    public function testSomething(): void
    {
        // This calls KernelTestCase::bootKernel(), and creates a
        // "client" that is acting as the browser
        $client = static::createClient();

        // Request a specific page
        $crawler = $client->request('GET', '/');

        // Validate a successful response and some content
        $this->assertResponseIsSuccessful();
        $this->assertSelectorTextContains('h1', 'Hello World');
    }
}

In the above example, the test validates that the HTTP response was successful and the request body contains a <h1> tag with "Hello world".

上記の例では、テストは HTTP 応答が成功したこと、および要求本文に「Hello world」のタグが含まれていることを検証します。

The request() method also returns a crawler, which you can use to create more complex assertions in your tests:

request() メソッドはクローラーも返します。これを使用して、テストでより複雑なアサーションを作成できます。
1
2
3
4
$crawler = $client->request('GET', '/post/hello-world');

// for instance, count the number of ``.comment`` elements on the page
$this->assertCount(4, $crawler->filter('.comment'));

You can learn more about the crawler in The DOM Crawler.

The DOM Crawler でクローラーの詳細を学ぶことができます。

Making Requests

The test client simulates an HTTP client like a browser and makes requests into your Symfony application:

テスト クライアントは、ブラウザのような HTTP クライアントをシミュレートし、Symfony アプリケーションにリクエストを送信します。
1
$crawler = $client->request('GET', '/post/hello-world');

The request() method takes the HTTP method and a URL as arguments and returns a Crawler instance.

request() メソッドは、HTTP メソッドと URL を引数として取り、Crawler インスタンスを返します。

Tip

ヒント

Hardcoding the request URLs is a best practice for application tests. If the test generates URLs using the Symfony router, it won't detect any change made to the application URLs which may impact the end users.

リクエスト URL をハードコーディングすることは、アプリケーション テストのベスト プラクティスです。テストが Symfony ルーターを使用して URL を生成する場合、エンド ユーザーに影響を与える可能性のあるアプリケーション URL への変更は検出されません。

The full signature of the request() method is:

request() メソッドの完全な署名は次のとおりです。
1
2
3
4
5
6
7
8
9
request(
    string $method,
    string $uri,
    array $parameters = [],
    array $files = [],
    array $server = [],
    string $content = null,
    bool $changeHistory = true
): Crawler

This allows you to create all types of requests you can think of:

これにより、考えられるすべてのタイプのリクエストを作成できます。

Tip

ヒント

The test client is available as the test.client service in the container in the test environment (or wherever the framework.test option is enabled). This means you can override the service entirely if you need to.

テスト クライアントは、テスト環境 (または、framework.test オプションが有効になっている場所) のコンテナーで test.client サービスとして利用できます。これは、必要に応じてサービス全体をオーバーライドできることを意味します。

Caution

注意

Before each request, the client reboots the kernel, recreating the container from scratch. This ensures that every requests are "isolated" using "new" service objects. Also, it means that entities loaded by Doctrine repositories will be "detached", so they will need to be refreshed by the manager or queried again from a repository.

各リクエストの前に、クライアントはカーネルを再起動し、コンテナを最初から再作成します。これにより、すべてのリクエストが「新しい」サービス オブジェクトを使用して「分離」されることが保証されます。マネージャーによって更新されるか、リポジトリから再度クエリされます。

Browsing the Site

The Client supports many operations that can be done in a real browser:

クライアントは、実際のブラウザーで実行できる多くの操作をサポートしています。
1
2
3
4
5
6
$client->back();
$client->forward();
$client->reload();

// clears all cookies and the history
$client->restart();

Note

ノート

The back() and forward() methods skip the redirects that may have occurred when requesting a URL, as normal browsers do.

back() および forward() メソッドは、通常のブラウザーが行うように、URL を要求するときに発生する可能性があるリダイレクトをスキップします。

Redirecting

When a request returns a redirect response, the client does not follow it automatically. You can examine the response and force a redirection afterwards with the followRedirect() method:

リクエストがリダイレクト レスポンスを返した場合、クライアントはそれを自動的にはフォローしません。 followRedirect() メソッドを使用して、応答を調べて、後で強制的にリダイレクトすることができます。
1
$crawler = $client->followRedirect();

If you want the client to automatically follow all redirects, you can force them by calling the followRedirects() method before performing the request:

クライアントがすべてのリダイレクトを自動的にたどるようにしたい場合は、リクエストを実行する前に followRedirects() メソッドを呼び出して強制できます。
1
$client->followRedirects();

If you pass false to the followRedirects() method, the redirects will no longer be followed:

followRedirects() メソッドに false を渡すと、リダイレクトは追跡されなくなります。
1
$client->followRedirects(false);

Logging in Users (Authentication)

When you want to add application tests for protected pages, you have to first "login" as a user. Reproducing the actual steps - such as submitting a login form - makes a test very slow. For this reason, Symfony provides a loginUser() method to simulate logging in in your functional tests.

保護されたページにアプリケーション テストを追加する場合は、最初にユーザーとして「ログイン」する必要があります。ログイン フォームの送信など、実際の手順を再現すると、テストが非常に遅くなります。このため、Symfony は機能テストでのログインをシミュレートする loginUser() メソッドを提供します。

Instead of logging in with real users, it's recommended to create a user only for tests. You can do that with Doctrine data fixtures to load the testing users only in the test database.

実際のユーザーでログインする代わりに、テスト専用のユーザーを作成することをお勧めします。 Doctrine データ フィクスチャを使用して、テスト データベースにのみテスト ユーザーをロードすることができます。

After loading users in your database, use your user repository to fetch this user and use $client->loginUser() to simulate a login request:

データベースにユーザーをロードした後、ユーザー リポジトリを使用してこのユーザーをフェッチし、$client->loginUser() を使用してログイン リクエストをシミュレートします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// tests/Controller/ProfileControllerTest.php
namespace App\Tests\Controller;

use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ProfileControllerTest extends WebTestCase
{
    // ...

    public function testVisitingWhileLoggedIn()
    {
        $client = static::createClient();
        $userRepository = static::getContainer()->get(UserRepository::class);

        // retrieve the test user
        $testUser = $userRepository->findOneByEmail('john.doe@example.com');

        // simulate $testUser being logged in
        $client->loginUser($testUser);

        // test e.g. the profile page
        $client->request('GET', '/profile');
        $this->assertResponseIsSuccessful();
        $this->assertSelectorTextContains('h1', 'Hello John!');
    }
}

You can pass any UserInterface instance to loginUser(). This method creates a special TestBrowserToken object and stores in the session of the test client.

任意の UserInterface インスタンスを loginUser() に渡すことができます。このメソッドは、特別なTestBrowserToken オブジェクトを作成し、テスト クライアントのセッションに保存します。

Note

ノート

By design, the loginUser() method doesn't work when using stateless firewalls. Instead, add the appropriate token/header in each request() call.

設計上、ステートレス ファイアウォールを使用している場合、loginUser() メソッドは機能しません。代わりに、各 request() 呼び出しに適切なトークン/ヘッダーを追加します。

Making AJAX Requests

The client provides an xmlHttpRequest() method, which has the same arguments as the request() method and is a shortcut to make AJAX requests:

クライアントは、request() メソッドと同じ引数を持つ xmlHttpRequest() メソッドを提供し、AJAX リクエストを作成するためのショートカットです。
1
2
// the required HTTP_X_REQUESTED_WITH header is added automatically
$client->xmlHttpRequest('POST', '/submit', ['name' => 'Fabien']);

Sending Custom Headers

If your application behaves according to some HTTP headers, pass them as the second argument of createClient():

アプリケーションが一部の HTTP ヘッダーに従って動作する場合は、それらを createClient() の 2 番目の引数として渡します。
1
2
3
4
$client = static::createClient([], [
    'HTTP_HOST'       => 'en.example.com',
    'HTTP_USER_AGENT' => 'MySuperBrowser/1.0',
]);

You can also override HTTP headers on a per request basis:

リクエストごとに HTTP ヘッダーをオーバーライドすることもできます。
1
2
3
4
$client->request('GET', '/', [], [], [
    'HTTP_HOST'       => 'en.example.com',
    'HTTP_USER_AGENT' => 'MySuperBrowser/1.0',
]);

Caution

注意

The name of your custom headers must follow the syntax defined in the section 4.1.18 of RFC 3875: replace - by _, transform it into uppercase and prefix the result with HTTP_. For example, if your header name is X-Session-Token, pass HTTP_X_SESSION_TOKEN.

カスタム ヘッダーの名前は、RFC 3875 のセクション 4.1.18 で定義されている構文に従う必要があります。たとえば、ヘッダー名が X-Session-Token の場合、HTTP_X_SESSION_TOKEN を渡します。

Reporting Exceptions

Debugging exceptions in application tests may be difficult because by default they are caught and you need to look at the logs to see which exception was thrown. Disabling catching of exceptions in the test client allows the exception to be reported by PHPUnit:

アプリケーション テストでの例外のデバッグは、デフォルトでキャッチされ、どの例外がスローされたかを確認するためにログを確認する必要があるため、難しい場合があります。テスト クライアントで例外のキャッチを無効にすると、例外が PHPUnit によって報告されるようになります。
1
$client->catchExceptions(false);

Accessing Internal Objects

If you use the client to test your application, you might want to access the client's internal objects:

クライアントを使用してアプリケーションをテストする場合、クライアントの内部オブジェクトにアクセスしたい場合があります。
1
2
$history = $client->getHistory();
$cookieJar = $client->getCookieJar();

You can also get the objects related to the latest request:

最新のリクエストに関連するオブジェクトを取得することもできます:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// the HttpKernel request instance
$request = $client->getRequest();

// the BrowserKit request instance
$request = $client->getInternalRequest();

// the HttpKernel response instance
$response = $client->getResponse();

// the BrowserKit response instance
$response = $client->getInternalResponse();

// the Crawler instance
$crawler = $client->getCrawler();

Accessing the Profiler Data

On each request, you can enable the Symfony profiler to collect data about the internal handling of that request. For example, the profiler could be used to verify that a given page runs less than a certain number of database queries when loading.

リクエストごとに、Symfony プロファイラーがそのリクエストの内部処理に関するデータを収集できるようにすることができます。たとえば、プロファイラーを使用して、ロード時に特定のページで実行されるデータベース クエリが一定数未満であることを確認できます。

To get the profiler for the last request, do the following:

最後のリクエストのプロファイラーを取得するには、次の手順を実行します。
1
2
3
4
5
6
7
// enables the profiler for the very next request
$client->enableProfiler();

$crawler = $client->request('GET', '/profiler');

// gets the profile
$profile = $client->getProfile();

For specific details on using the profiler inside a test, see the How to Use the Profiler in a Functional Test article.

テスト内でのプロファイラーの使用に関する具体的な詳細については、機能テストでプロファイラーを使用する方法の記事を参照してください。

Interacting with the Response

Like a real browser, the Client and Crawler objects can be used to interact with the page you're served:

実際のブラウザのように、Client オブジェクトと Crawler オブジェクトを使用して、提供されているページと対話できます。

Use the clickLink() method to click on the first link that contains the given text (or the first clickable image with that alt attribute):

clickLink() メソッドを使用して、指定されたテキスト (またはその alt 属性を持つ最初のクリック可能な画像) を含む最初のリンクをクリックします。
1
2
3
4
$client = static::createClient();
$client->request('GET', '/post/hello-world');

$client->clickLink('Click here');

If you need access to the Link object that provides helpful methods specific to links (such as getMethod() and getUri()), use the Crawler::selectLink() method instead:

リンクに固有の便利なメソッド (getMethod() や getUri() など) を提供する Link オブジェクトにアクセスする必要がある場合は、代わりに Crawler::selectLink() メソッドを使用します。
1
2
3
4
5
6
7
8
$client = static::createClient();
$crawler = $client->request('GET', '/post/hello-world');

$link = $crawler->selectLink('Click here')->link();
// ...

// use click() if you want to click the selected link
$client->click($link);

Submitting Forms

Use the submitForm() method to submit the form that contains the given button:

特定のボタンを含むフォームを送信するには、submitForm() メソッドを使用します。
1
2
3
4
5
6
$client = static::createClient();
$client->request('GET', '/post/hello-world');

$crawler = $client->submitForm('Add comment', [
    'comment_form[content]' => '...',
]);

The first argument of submitForm() is the text content, id, value or name of any <button> or <input type="submit"> included in the form. The second optional argument is used to override the default form field values.

submitForm() の最初の引数は、フォームに含まれるいずれかのテキスト コンテンツ、ID、値、または名前です。2 番目のオプションの引数は、デフォルトのフォーム フィールド値をオーバーライドするために使用されます。

Note

ノート

Notice that you select form buttons and not forms, as a form can have several buttons. If you use the traversing API, keep in mind that you must look for a button.

フォームには複数のボタンを含めることができるため、フォームではなくフォーム ボタンを選択することに注意してください。 traversing API を使用する場合は、ボタンを探す必要があることに注意してください。

If you need access to the Form object that provides helpful methods specific to forms (such as getUri(), getValues() and getFields()) use the Crawler::selectButton() method instead:

フォームに固有の便利なメソッド (getUri()、getValues()、getFields() など) を提供する Form オブジェクトにアクセスする必要がある場合は、代わりに Crawler::selectButton() メソッドを使用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$client = static::createClient();
$crawler = $client->request('GET', '/post/hello-world');

// select the button
$buttonCrawlerNode = $crawler->selectButton('submit');

// retrieve the Form object for the form belonging to this button
$form = $buttonCrawlerNode->form();

// set values on a form object
$form['my_form[name]'] = 'Fabien';
$form['my_form[subject]'] = 'Symfony rocks!';

// submit the Form object
$client->submit($form);

// optionally, you can combine the last 2 steps by passing an array of
// field values while submitting the form:
$client->submit($form, [
    'my_form[name]'    => 'Fabien',
    'my_form[subject]' => 'Symfony rocks!',
]);

Based on the form type, you can use different methods to fill in the input:

フォームの種類に基づいて、さまざまな方法を使用して入力を入力できます。
1
2
3
4
5
6
7
8
9
10
11
12
// selects an option or a radio
$form['my_form[country]']->select('France');

// ticks a checkbox
$form['my_form[like_symfony]']->tick();

// uploads a file
$form['my_form[photo]']->upload('/path/to/lucas.jpg');

// In the case of a multiple file upload
$form['my_form[field][0]']->upload('/path/to/lucas.jpg');
$form['my_form[field][1]']->upload('/path/to/lisa.jpg');

Tip

ヒント

Instead of hardcoding the form name as part of the field names (e.g. my_form[...] in previous examples), you can use the getName() method to get the form name.

フォーム名をフィールド名の一部としてハードコーディングする代わりに (前の例の my_form[...] など)、getName() メソッドを使用してフォーム名を取得できます。

Tip

ヒント

If you purposefully want to select "invalid" select/radio values, see The DomCrawler Component.

意図的に「無効な」select/radio 値を選択したい場合は、DomCrawler コンポーネントを参照してください。

Tip

ヒント

You can get the values that will be submitted by calling the getValues() method on the Form object. The uploaded files are available in a separate array returned by getFiles(). The getPhpValues() and getPhpFiles() methods also return the submitted values, but in the PHP format (it converts the keys with square brackets notation - e.g. my_form[subject] - to PHP arrays).

Form オブジェクトで getValues() メソッドを呼び出すことにより、送信される値を取得できます。アップロードされたファイルは、getFiles() によって返される別の配列で利用できます。 getPhpValues() および getPhpFiles() メソッドも送信された値を返しますが、PHP 形式です (角括弧表記 (my_form[subject] など) でキーを PHP 配列に変換します)。

Tip

ヒント

The submit() and submitForm() methods define optional arguments to add custom server parameters and HTTP headers when submitting the form:

submit() および submitForm() メソッドは、オプションの引数を定義して、フォームの送信時にカスタム サーバー パラメータと HTTP ヘッダーを追加します。
1
2
$client->submit($form, [], ['HTTP_ACCEPT_LANGUAGE' => 'es']);
$client->submitForm($button, [], 'POST', ['HTTP_ACCEPT_LANGUAGE' => 'es']);

Testing the Response (Assertions)

Now that the tests have visited a page and interacted with it (e.g. filled in a form), it is time to verify that the expected output is shown.

テストがページにアクセスし、それと対話した (フォームに入力するなど) ので、期待される出力が表示されることを確認します。

As all tests are based on PHPUnit, you can use any PHPUnit Assertion in your tests. Combined with test Client and the Crawler, this allows you to check anything you want.

すべてのテストは PHPUnit に基づいているため、テストでは任意の PHPUnit アサーションを使用できます。テスト クライアントとクローラーを組み合わせることで、必要なものをすべてチェックできます。

However, Symfony provides useful shortcut methods for the most common cases:

ただし、Symfony は、最も一般的なケースに対して便利なショートカット メソッドを提供しています。

Response Assertions

assertResponseIsSuccessful(string $message = '')
Asserts that the response was successful (HTTP status is 2xx).
応答が成功したことをアサートします (HTTP ステータスは 2xx です)。
assertResponseStatusCodeSame(int $expectedCode, string $message = '')
Asserts a specific HTTP status code.
特定の HTTP ステータス コードをアサートします。
assertResponseRedirects(string $expectedLocation = null, int $expectedCode = null, string $message = '')
Asserts the response is a redirect response (optionally, you can check the target location and status code).
応答がリダイレクト応答であることをアサートします (オプションで、ターゲットの場所とステータス コードを確認できます)。
assertResponseHasHeader(string $headerName, string $message = '')/assertResponseNotHasHeader(string $headerName, string $message = '')
Asserts the given header is (not) available on the response.
指定されたヘッダーが応答で使用可能である (使用できない) ことをアサートします。
assertResponseHeaderSame(string $headerName, string $expectedValue, string $message = '')/assertResponseHeaderNotSame(string $headerName, string $expectedValue, string $message = '')
Asserts the given header does (not) contain the expected value on the response.
指定されたヘッダーに応答の期待値が含まれている (含まれていない) ことをアサートします。
assertResponseHasCookie(string $name, string $path = '/', string $domain = null, string $message = '')/assertResponseNotHasCookie(string $name, string $path = '/', string $domain = null, string $message = '')
Asserts the given cookie is present in the response (optionally checking for a specific cookie path or domain).
指定された Cookie が応答に存在することをアサートします (オプションで、特定の Cookie パスまたはドメインをチェックします)。
assertResponseCookieValueSame(string $name, string $expectedValue, string $path = '/', string $domain = null, string $message = '')
Asserts the given cookie is present and set to the expected value.
指定された Cookie が存在し、期待値に設定されていることをアサートします。
assertResponseFormatSame(?string $expectedFormat, string $message = '')
Asserts the response format returned by the getFormat() method is the same as the expected value.
getFormat() メソッドによって返される応答形式が期待値と同じであることをアサートします。
assertResponseIsUnprocessable(string $message = '')
Asserts the response is unprocessable (HTTP status is 422)
応答が処理不能であることをアサートします (HTTP ステータスは 422)。

Request Assertions

assertRequestAttributeValueSame(string $name, string $expectedValue, string $message = '')
Asserts the given request attribute is set to the expected value.
指定されたリクエスト属性が期待値に設定されていることをアサートします。
assertRouteSame($expectedRoute, array $parameters = [], string $message = '')
Asserts the request matches the given route and optionally route parameters.
リクエストが指定されたルートとオプションでルート パラメータに一致することをアサートします。

Browser Assertions

assertBrowserHasCookie(string $name, string $path = '/', string $domain = null, string $message = '')/assertBrowserNotHasCookie(string $name, string $path = '/', string $domain = null, string $message = '')
Asserts that the test Client does (not) have the given cookie set (meaning, the cookie was set by any response in the test).
テスト クライアントが指定された Cookie セットを持っている (持っていない) ことをアサートします (つまり、テストの応答によって Cookie が設定されました)。
assertBrowserCookieValueSame(string $name, string $expectedValue, string $path = '/', string $domain = null, string $message = '')
Asserts the given cookie in the test Client is set to the expected value.
テスト クライアントで指定された Cookie が期待値に設定されていることをアサートします。
assertThatForClient(Constraint $constraint, string $message = '')

Asserts the given Constraint in the Client. Useful for using your custom asserts in the same way as built-in asserts (i.e. without passing the Client as argument):

クライアントで指定された制約をアサートします。カスタム assert を組み込みの assert と同じように (つまり、クライアントを引数として渡さずに) 使用する場合に便利です。
1
2
3
4
5
// add this method in some custom class imported in your tests
protected static function assertMyOwnCustomAssert(): void
{
    self::assertThatForClient(new SomeCustomConstraint());
}

Crawler Assertions

assertSelectorExists(string $selector, string $message = '')/assertSelectorNotExists(string $selector, string $message = '')
Asserts that the given selector does (not) match at least one element in the response.
指定されたセレクターが応答内の少なくとも 1 つの要素と一致する (一致しない) ことをアサートします。
assertSelectorTextContains(string $selector, string $text, string $message = '')/assertSelectorTextNotContains(string $selector, string $text, string $message = '')
Asserts that the first element matching the given selector does (not) contain the expected text.
指定されたセレクターに一致する最初の要素に、期待されるテキストが含まれている (含まれていない) ことをアサートします。
assertSelectorTextSame(string $selector, string $text, string $message = '')
Asserts that the contents of the first element matching the given selector does (not) equal the expected text.
指定されたセレクターに一致する最初の要素の内容が、予期されるテキストと等しい (等しくない) ことをアサートします。
assertPageTitleSame(string $expectedTitle, string $message = '')
Asserts that the <title> element is equal to the given title.
要素が指定されたタイトルと等しいことをアサートします。
assertPageTitleContains(string $expectedTitle, string $message = '')
Asserts that the <title> element contains the given title.
指定されたタイトルが要素に含まれていることをアサートします。
assertInputValueSame(string $fieldName, string $expectedValue, string $message = '')/assertInputValueNotSame(string $fieldName, string $expectedValue, string $message = '')
Asserts that value of the form input with the given name does (not) equal the expected value.
指定された名前のフォーム入力の値が期待値と等しい (等しくない) ことをアサートします。
assertCheckboxChecked(string $fieldName, string $message = '')/assertCheckboxNotChecked(string $fieldName, string $message = '')
Asserts that the checkbox with the given name is (not) checked.
指定された名前のチェックボックスがチェックされている (チェックされていない) ことをアサートします。
assertFormValue(string $formSelector, string $fieldName, string $value, string $message = '')/assertNoFormValue(string $formSelector, string $fieldName, string $message = '')
Asserts that value of the field of the first form matching the given selector does (not) equal the expected value.
指定されたセレクターに一致する最初のフォームのフィールドの値が期待値と等しい (等しくない) ことをアサートします。

Mailer Assertions

assertEmailCount(int $count, string $transport = null, string $message = '')
Asserts that the expected number of emails was sent.
予想された数の電子メールが送信されたことをアサートします。
assertQueuedEmailCount(int $count, string $transport = null, string $message = '')
Asserts that the expected number of emails was queued (e.g. using the Messenger component).
予想される数の電子メールがキューに入れられたことをアサートします (たとえば、Messenger コンポーネントを使用して)。
assertEmailIsQueued(MessageEvent $event, string $message = '')/assertEmailIsNotQueued(MessageEvent $event, string $message = '')
Asserts that the given mailer event is (not) queued. Use getMailerEvent(int $index = 0, string $transport = null) to retrieve a mailer event by index.
指定されたメーラー イベントがキューに入れられている (いない) ことをアサートします。 getMailerEvent(int $index = 0, string $transport = null) を使用して、メーラー イベントをインデックスで取得します。
assertEmailAttachmentCount(RawMessage $email, int $count, string $message = '')
Asserts that the given email has the expected number of attachments. Use getMailerMessage(int $index = 0, string $transport = null) to retrieve a specific email by index.
指定された電子メールに予想される数の添付ファイルがあることをアサートします。 getMailerMessage(int $index = 0, string $transport = null) を使用して、特定のメールをインデックスで取得します。
assertEmailTextBodyContains(RawMessage $email, string $text, string $message = '')/assertEmailTextBodyNotContains(RawMessage $email, string $text, string $message = '')
Asserts that the text body of the given email does (not) contain the expected text.
指定された電子メールのテキスト本文に、期待されるテキストが含まれている (含まれていない) ことをアサートします。
assertEmailHtmlBodyContains(RawMessage $email, string $text, string $message = '')/assertEmailHtmlBodyNotContains(RawMessage $email, string $text, string $message = '')
Asserts that the HTML body of the given email does (not) contain the expected text.
指定された電子メールの HTML 本文に期待されるテキストが含まれている (含まれていない) ことをアサートします。
assertEmailHasHeader(RawMessage $email, string $headerName, string $message = '')/assertEmailNotHasHeader(RawMessage $email, string $headerName, string $message = '')
Asserts that the given email does (not) have the expected header set.
指定された電子メールに期待されるヘッダー セットがない (ない) ことをアサートします。
assertEmailHeaderSame(RawMessage $email, string $headerName, string $expectedValue, string $message = '')/assertEmailHeaderNotSame(RawMessage $email, string $headerName, string $expectedValue, string $message = '')
Asserts that the given email does (not) have the expected header set to the expected value.
指定された電子メールに、予期されるヘッダーが予期される値に設定されている (ない) ことをアサートします。
assertEmailAddressContains(RawMessage $email, string $headerName, string $expectedValue, string $message = '')
Asserts that the given address header equals the expected e-mail address. This assertion normalizes addresses like Jane Smith <jane@example.com> into jane@example.com.
指定されたアドレス ヘッダーが予想される電子メール アドレスと等しいことをアサートします。このアサーションは、Jane Smith のようなアドレスを jane@example.com に正規化します。

Notifier Assertions

assertNotificationCount(int $count, string $transportName = null, string $message = '')
Asserts that the given number of notifications has been created (in total or for the given transport).
指定された数の通知が (合計で、または指定されたトランスポートに対して) 作成されたことをアサートします。
assertQueuedNotificationCount(int $count, string $transportName = null, string $message = '')
Asserts that the given number of notifications are queued (in total or for the given transport).
指定された数の通知が (合計または指定されたトランスポートに対して) キューに入れられていることをアサートします。
assertNotificationIsQueued(MessageEvent $event, string $message = '')
Asserts that the given notification is queued.
指定された通知がキューに入れられていることをアサートします。
assertNotificationIsNotQueued(MessageEvent $event, string $message = '')
Asserts that the given notification is not queued.
指定された通知がキューに入れられていないことをアサートします。
assertNotificationSubjectContains(MessageInterface $notification, string $text, string $message = '')
Asserts that the given text is included in the subject of the given notification.
指定されたテキストが指定された通知の件名に含まれていることをアサートします。
assertNotificationSubjectNotContains(MessageInterface $notification, string $text, string $message = '')
Asserts that the given text is not included in the subject of the given notification.
指定されたテキストが指定された通知の件名に含まれていないことをアサートします。
assertNotificationTransportIsEqual(MessageInterface $notification, string $transportName, string $message = '')
Asserts that the name of the transport for the given notification is the same as the given text.
指定された通知のトランスポートの名前が指定されたテキストと同じであることをアサートします。
assertNotificationTransportIsNotEqual(MessageInterface $notification, string $transportName, string $message = '')
Asserts that the name of the transport for the given notification is not the same as the given text.
指定された通知のトランスポートの名前が指定されたテキストと同じではないことをアサートします。

6.2

6.2

The Notifier assertions were introduced in Symfony 6.2.

Notifier アサーションは Symfony 6.2 で導入されました。

Learn more