Ich nehme mir die Freiheit, NSubstitute anstelle von moq zu verwenden, aber Sie können wahrscheinlich den Weg finden, es mit moq selbst zu tun. Ich werde auch AutoFixture.Xunit2 verwenden, weil es großartig ist.
private MainClass _target;
private IFoo _foo = Substitue.For<IFoo>();
private IBar _bar = Substitute.For<IBar>();
private IBaz _baz = Substitute.For<IBaz>();
public MainClassTest()
{
_target = new MainClass(_foo, _bar, _baz);
}
[Theory, AutoData]
public void DoStuff_Delegates_To_Foo(string myParam)
{
_target.DoStuff(myParam);
_foo.Received.DoFoo(Arg.Is(myParam));
}
[Theory, AutoData]
public void DoStuff_Calls_Bar_With_Result_From_Foo(string myParam, object fooResult)
{
_foo.DoFoo(Arg.Is(myParam)).Returns(fooResult);
_target.DoStuff(myParam);
_bar.Received().DoBar(Arg.Is(fooResult));
}
[Theory, AutoData]
public void DoStuff_Calls_Baz_After_Foo_And_Bar(string myParam)
{
_target.DoStuff(myParam);
Received.InOrder(() =>
{
_foo.DoFoo(Arg.Any<string>());
_bar.DoBar(Arg.Any<object>());
_baz.DoBaz();
}
}
Die Idee ist, ein Testverfahren für jede Sache, die Sie über die DoStuff
Methode wissen wollen, haben. Die oben genannten sind nur Beispiele, wenn Sie möchten, können Sie auch alles in einem Test schreiben. Hier besteht die Herausforderung darin, eine gute Beschreibung dessen zu finden, was Sie testen (also stellen Sie sich vor, Sie benennen den Test, und Ihr Kollege implementiert es), hier folgt ein Beispiel für eine schlecht benannte Testmethode, die alles testet.
[Theory, AutoData]
public void DoStuff_Does_What_It_Is_Supposed_To_Do(string myParam, object fooResult)
{
_foo.DoFoo(Arg.Is(myParam)).Returns(fooResult);
_target.DoStuff(myParam);
Received.InOrder(() =>
{
_foo.DoFoo(Arg.Is(myParam));
_bar.DoBar(Arg.Is(fooResult));
_baz.DoBaz();
}
}
Um Ihre Frage zu beantworten, kommt es auf die Benennung an. Wenn Sie den Test in einem kurzen Satz beschreiben können, dann machen Sie es. Sie haben wahrscheinlich gehört, dass jede Testmethode eine Sache und nur eine Sache testen sollte, und es hilft, wenn Sie "Sache" in diesem Zusammenhang als etwas betrachten, das Sie in einem einzigen kurzen Satz beschreiben können.
Unit Test was? Gegen welche Spezifikationen? Ich sehe hier keine Schnittstellen. – Raedwald
IFoo ist eine der Schnittstellen, die beim Testen von DoStuff verspottet werden. – eych