とりあえずTestRunnerで動かす時にどうするのか、流れをしるために簡単な例を試してみる
追記)今回はZenjectのフレームワークでテストするだけだったのでタイトル変えました。次回以降ちゃんとバインドします。
追記:
もうちょいちゃんとゲームぽいの書きました。
環境
Uniry 2017.3.0f3
Mac OSX 10.12.6
ビルドターゲットMacOSX
.NET 4.6相当
簡単なテストの確認
Githubのドキュメントが手元環境ではうまくいかなかったので以下のテストケースに変更
※具体的には
- PreInstall()とPostInstall()を呼んでいない
- Assert.ThrowsでTActualの型を要求される
の二点が問題となっていた。
修正した版はGistにでも貼っておきます。
本家にもプルリクしといたけど、プルリク素人のためrejectされちゃいそうなので。
TestLogger.cs
using System.Collections;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using Zenject;
[TestFixture]
public class TestLogger : ZenjectIntegrationTestFixture {
[SetUp]
public void CommonInstall () {
PreInstall ();
Container.Bind<Logger> ().AsSingle ();
PostInstall ();
}
[Test]
public void TestFirstEntry () {
var logger = Container.Resolve<Logger> ();
logger.Write ("foo");
Assert.That (logger.Log == "foo");
}
[Test]
public void TestAppend () {
var logger = Container.Resolve<Logger> ();
logger.Write ("foo");
logger.Write ("bar");
Assert.That (logger.Log == "foobar");
}
[Test]
public void TestNullValue () {
var logger = Container.Resolve<Logger> ();
Assert.Throws<System.ArgumentException> (() => logger.Write (null));
}
[UnityTest]
public IEnumerator TestLoggerWithEnumeratorPasses () {
var logger = Container.Resolve<Logger> ();
Assert.IsNotNull (logger);
yield return null;
logger.Write ("foo");
logger.Write ("bar");
yield return new WaitForSeconds (0.5f);
Assert.That (logger.Log == "foobar");
}
}
簡単なテストの場合は
- testerとなるクラスをZenjectIntegrationTestFixture継承とする
- SetUpアトリビュートのついた関数内にバインディングをかく
- 上記バインディングを挟むようにPre,PostInstall()を呼んであげる
で解決。簡単。すき。