概要
IInitializable
、ITickable
、IDisposable
はZenjectUnitTestFixture
を継承したテストクラスでバインドしても実行されないっぽい。
Zenjectのテスト作成ドキュメント内、IntegrationTest
の項目にそれっぽい事が書いてある。
以下は軽い解説。
Zenject.IInitializable
ZenjectはIInitializable
を実装する事で、よしなにインスタンスの初期化を行う事が出来る。
public class Hoge : IInitializable
{
private int fuga = 0;
void IInitializable.Initialize()
{
Debug.Log("初期化");
fuga = 100;
}
public int GetFuga()
{
Debug.Log(fuga);
}
}
以上のHogeクラス
をMonoInstaller
でバインドし...
public class HogeInstaller : MonoInstaller<HogeInstaller>
{
public override void InstallBindings()
{
Container.BindInterfacesTo<Hoge>().AsSingle();
}
}
実行すればコンソールに初期化
と出力され、fuga
には100が代入される。
UnitTestで問題は起きた
上記のHoge
クラスにZenjectのUnitTestを実装する場合はこんなコードが書かれるでしょう。
[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
で行う
みたいな感じでやっておくとテストを書く時にも困らなさそうです。