3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Zenject】ZenjectのUnitTestでIInitializableは走らない

Posted at

概要

IInitializableITickableIDisposableZenjectUnitTestFixtureを継承したテストクラスでバインドしても実行されないっぽい。
Zenjectのテスト作成ドキュメント内、IntegrationTestの項目にそれっぽい事が書いてある。
以下は軽い解説。

Zenject.IInitializable

ZenjectはIInitializableを実装する事で、よしなにインスタンスの初期化を行う事が出来る。

Hoge.cs
public class Hoge : IInitializable
{
    private int fuga = 0;

    void IInitializable.Initialize()
    {
        Debug.Log("初期化");
        fuga = 100;
    }

    public int GetFuga()
    {
        Debug.Log(fuga);
    }
}

以上のHogeクラスMonoInstallerでバインドし...

HogeInstaller.cs
public class HogeInstaller : MonoInstaller<HogeInstaller>
{
    public override void InstallBindings()
    {
        Container.BindInterfacesTo<Hoge>().AsSingle();
    }
}

実行すればコンソールに初期化と出力され、fugaには100が代入される。

UnitTestで問題は起きた

上記のHogeクラスにZenjectのUnitTestを実装する場合はこんなコードが書かれるでしょう。

HogeTst.cs
[TestFixture]
public class HogeTest : ZenjectUnitTestFixture
{
    [SetUp]
    public void CommonInstall()
    {
        Container.BindInterfacesTo<Hoge>().AsSingle();
    }

    [Test]
    public void FugaTest()
    {
        var hoge = Container.Resolve<Hoge>();
        var fuga = Hoge.GetFuga();
        //初期化が実行されて値が代入されているという想定
        Assert.AreEqual(100, fuga);
    }
}

残念ながら概要にも書いたようにInitialize関数が実行されない為FugaTestは失敗してしまいます。

対策

Hoge.Initializableの内容をコンストラクタで実行するとテストは通るようになります。
コンストラクタで実行すべき初期化とIInitializableで実行すべき初期化は見極めるべき。
IInitializable.Initialize関数はオブジェクトグラフの構築後(すべてのコンストラクタが実行された)に実行されるものであり

  • インスタンスに必要な初期化はコンストラクタで行う
  • DIされるクラスを触る初期化はIInitializable.Initializeで行う

みたいな感じでやっておくとテストを書く時にも困らなさそうです。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?