Я начинаю работать с Moq и очень люблю его. Я пишу несколько тестов контроллера, которые имеют несколько сервисов и интерфейсов, чтобы организовать мой контроллер для теста. Мне бы хотелось немного его модульнить, и я подумал, что это будет тривиальной задачей, но оказалось, что это немного сложнее, чем я думал.
Вот один простой модульный тест, который я должен показать на примере:
[Test]
public void Get_SignIn_Should_Return_View()
{
#region //TODO: figure out how to extract this out to avoid duplicate code
// Arrange
var membershipService = new Mock<IMembershipService>();
var formsService = new Mock<IFormsAuthenticationService>();
var userService = new Mock<IUserService>();
var dictService = new Mock<IDictionaryService>();
var shoppingBasketService = new Mock<IShoppingBasketService>();
//Create the service provider mock and pass in the IRepositoryFactory so that it isn't instantiating real repositories
var repoFactory = new Mock<IRepositoryFactory>();
var serviceProvider = new Mock<ServiceProvider>( (IRepositoryFactory)repoFactory.Object );
var context = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock };
var sessionVars = new Mock<SessionVars>();
AccountController controller = new AccountController( serviceProvider.Object, sessionVars.Object )
{
FormsService = formsService.Object,
MembershipService = membershipService.Object,
UserService = userService.Object,
DictionaryService = dictService.Object,
ShoppingService = shoppingBasketService.Object
};
controller.ControllerContext = new ControllerContext()
{
Controller = controller,
RequestContext = new RequestContext( context.Object, new RouteData() )
};
#endregion
// Act
ActionResult result = controller.SignIn();
// Assert
Assert.IsInstanceOf<ViewResult>( result );
}
То, что я хотел бы сделать, это взять все в #region
и извлечь это во вспомогательный метод или метод [Setup], но если я это сделаю, то у меня нет доступа к каждому макет службы для установки ожиданий.
Есть ли что-то, чего мне здесь не хватает, или мне действительно нужно копировать и вставлять этот фрагмент кода Arrange в каждом модульном тесте?