BEAR.Sunday Advent Calendar 2018 18日目の記事です。

以前も 書いた とおり、主にメインのWEBアプリケーションとは独立して動く小さなコンポーネントやスクリプトを書くときにRay.Diを使っています。

Moduleクラスをテストしたい!

ModuleクラスでDIを定義した場合、困るのはどうやってテストしたら良いか?ということです。

テストを書きたい理由としては、別にカバレッジを上げたいわけではありません。単に私がRay.Diにそれほど慣れていないので正しい記述ができているかどうか自信がなくて、テストで証明して安心したいからです。

どのようなテストを書けば良いか

では、Moduleクラスに対してどんなテストを書けば良いでしょうか?

仮にユニットテストを書くとしましょう。
ユニットテストで検証できるのは、Moduleクラス内で どんなbind()を呼び出したか までです。
そのbind()呼び出しが正しく依存を定義できているかは検証できません。
ユニットテストでは不十分だということがわかります。

Ray.DiのDI定義として正しい記述ができていることを確認したいわけなので、ユニットテストではなく Ray.DiのInjectorから所望のインスタンスが取り出せているか検証するテスト 、いわゆる機能テストを書けば良さそうです!
というわけで書いてみました。

<?php

namespace Quartetcom\RaySample\Functional;
use PHPUnit\Framework\TestCase;
use Quartetcom\RaySample\DependencyInjection\RaySampleModule;
use Quartetcom\RaySample\RaySample;
use Ray\Di\Injector;
class RaySampleModuleTest extends TestCase
{
    public function test()
    {
        $injector = new Injector(new RaySampleModule());
        $this->assertInstanceOf(RaySample::class, $injector->getInstance(RaySample::class));
    }
}

まとめ

カルテット開発部ではよほど軽微な文言変更以外は、必ずテストを書くようにしています。
テストは開発者の安心のためにあるからです。

DIの仕組みとしてRay.Diを使い、かつModuleに対するテストを書いたサンプルプロジェクトを下記に置きました。ご参考にどうぞ
https://github.com/77web/RayDi-usage-testing-module