Я новичок в AutoFixture и пытаюсь создать дружественное расширение в моем тестовом контексте для менее склонных TDD разработчиков в команде. Вот код:Управление сервисами, поданными в контроллеры MVC с помощью AutoFixture в универсальном тестовом помощнике
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
y!
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 =() =>
{
};
}
Я изо всех сил, чтобы найти какие-либо примеры кто-то делает что-то подобное, я знаю, что я определенно делать что-то глупое здесь, но в моей голове этот тест должен пройти?
Это не совсем работа,. должен ли «статический ISomeService SomeService» быть «статическим Mock SomeService», или если метод «For» изменился как реальный экземпляр? –
Grace
@Grace: он должен быть 'Mock'. Исправлено. –
Что делать, если тестовый клиент читает свойство 'ControllerUnderTest' перед вызовом метода' For'? –