モジュールを作成するとき、アプリケーションの最も重要な部分の単体テストをモジュールに提供しようとしています。ただし、現時点(Magento 2.1.3)では、単体テストの作成方法についていくつかの方法があります。
さまざまなテスト方法
- それを統合し、bin/magento dev:tests:run unitMagentoにバンドルされているデフォルトのphpunit設定の上で実行します。
- それらを別々にvendor/bin/phpunit app/code/Vendor/Module/Test/Unit記述し、実行して、Magentoであるすべてをモックします。
- それらを個別に記述し、すべてをモックし、PHPUnitのシステムグローバルバージョンを使用します。
- それらを別々に記述し、で実行しますがvendor/bin/phpunit、それでも利用し\Magento\Framework\TestFramework\Unit\Helper\ObjectManagerます。
Magento 2およびPHPUnit
それに加えて、Magento 2にはPHPUnit 4.1.0がバンドルされており、PHP7互換ではありません。ネイティブ型(stringおよびintなど)を型ヒントし、署名で戻り値の型を宣言すると、エラーがスローされます。たとえば、次のようなメソッドシグネチャを持つインターフェイス/クラス:
public function foo(string $bar) : bool;... PHPUnit 4.1.0でモックすることはできません。:-(
私の現在の状況
このため、私はほとんどの場合、3番目の方法(システムグローバルなPHPUnitバージョンを呼び出すこと)で単体テストを書いています。
私の設定では、PHPUnit 5.6がグローバルにインストールされているため、適切なPHP7コードを記述して解決できますが、いくつかの調整が必要です。例えば:
phpunit.xml コンポーザーオートローダーを使用できるように、次のようにする必要があります。
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
         colors="true">
    <testsuites>
        <testsuite name="Testsuite">
            <directory>.</directory>
        </testsuite>
    </testsuites>
</phpunit>...そして、私のすべての- setUp()メソッドでは、次のチェックを行っているので、前方互換性でテストを書くことができます:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
    $this->markTestSkipped();
}このように、Magentosの組み込みPHPUnitでテストを実行すると、エラーはスローされません。
私の質問
だからここに私の質問があります:これは単体テストを書く「健康な」方法ですか?なぜなら、Magentoにはテストを支援するためのツールが多数バンドルされているのは正しくないと思われ、PHP7を使用しているため使用できません。この問題に対処するGitHubのチケットがあることは知っていますが、コミュニティが現在どのようにテストを書いているのでしょうか。
Magento 2でユニットテストを書く方法はありますか?コードを「ダウングレード」する必要はなく、Magentoのビルトインヘルパーを使用してオブジェクトマネージャーが触れるすべてをモックできますか?または、単体テストでもオブジェクトマネージャーを使用するのは悪い習慣ですか?
独自のカスタムモジュールを単体テストする方法に関する適切な方法について、多くのガイダンス/例が不足しています。