私は AutoFixture を初めて使用し、チーム内の TDD に傾倒していない開発者向けに、テスト コンテキストにわかりやすい拡張機能を作成しようとしています。コードは次のとおりです。
public class HomeController : Controller
{
private readonly ISomeService _someService;
public HomeController(ISomeService someService)
{
_someService = someService;
}
public ActionResult Index()
{
_someService.SomeMethod();
return View("Index");
}
}
public class ControllerContext<T> where T : Controller
{
protected static T ControllerUnderTest;
private static IFixture _fixture;
public ControllerContext()
{
_fixture = new Fixture().Customize(new AutoMoqCustomization());
_fixture.Customize<ControllerContext>(c => c.Without(x => x.DisplayMode));
ControllerUnderTest = _fixture.Create<T>();
}
protected static Mock<TDouble> For<TDouble>() where TDouble : class
{
//var mock = _fixture.Create<TDouble>();
var mock = _fixture.Create<Mock<TDouble>>();
return mock;
}
}
したがって、拡張機能はFor
メソッドです- ControllerUnderTest
「ISomeService」が注入されているものを調べると、インスタンスが正常に注入されており、私が主張しているメソッドを確実に呼び出します。「For」メソッドで作成されたモックを調べると、コントローラーに注入されたものと同じバージョンのように見えますが、そうではありませんVerif
!
public class EXAMPLE_When_going_to_home_page : ControllerContext<HomeController>
{
Because of = () =>
{
ControllerUnderTest.Index();
};
It should_do_something = () =>
{
//This throws a 'Invocation was not performed'
For<ISomeService>().Verify(x => x.SomeMethod());
};
Establish context = () =>
{
};
}
私は誰かが似たようなことをしている例を見つけるのに苦労しています.私は間違いなくここで愚かなことをしていることを知っていますが、頭の中でこのテストは合格するはずですか?