imog

主にUnityとかの事を書いています

Extenject(Zenject)のTestがNSubstituteをサポートしていた

割と最近の出来事だった

github.com

元々Zenjectはテスト時のモックライブラリとしてMoqを採用していたんだけど、このPRでまた別のモックライブラリであるNSubstituteを使えるようになった。選択肢が増えたのだった。

Moq

github.com

NSubstitute

nsubstitute.github.io

使い方

まだreleasesには含まれていないのでmasterブランチから直接取ってくることにはなる。

Assets\Plugins\Zenject\OptionalExtrasに新しくAutoSubstitute.zipがあるので、展開してAssets\Plugins\Zenject\OptionalExtras\TestFramework下に放り込んであげましょう。

image

雑にIFooを作る

public interface IFoo
{
    string SayFoo(string suffix);
}

DummyObjectを作るだけなら、FromSubstituteを呼ぶだけでOK

Container.Bind<IFoo>().FromSubstitute();

メソッドが呼ばれたかとか諸々確認したいときはRecievedをメソッドチェーンに挟む

var foo = Substitute.For<IFoo>();
// 引数で"Bar"が渡されると"FooBar"を返す。それ以外が来るとFail
foo.Received().SayFoo("Bar").Returns("FooBar");

すでにUnityで使ってる事例があったのでこっちを見るほうがよさそう。 qiita.com

どちらを選ぶかは割と好みだけど、個人的にはNSubstituteの方がメソッドチェーンで書きやすくて好き。