Sto iniziando dal framework Moq e lo adoro assolutamente. Sto scrivendo alcuni test del controller che hanno diversi servizi e interfacce per organizzare il mio controller per il test. Mi piacerebbe modularizzarlo un po 'di più, e ho pensato che sarebbe stato un compito banale, ma si rivela essere un po' più complicato di quanto pensassi.Test del controller Moq con setup ripetuto
Ecco un semplice test di unità che devo mostrare un esempio:
[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);
}
Quello che mi piacerebbe essere in grado di fare è prendere tutto nel #region
ed estrarre che fuori in un metodo di supporto o Metodo [Setup], ma se lo faccio, allora non ho accesso a ogni servizio di simulazione per impostare le aspettative.
C'è qualcosa che mi manca qui, o devo davvero copiare e incollare questo pezzo di codice Arrange in ogni test di Unità?
Questo è quello che faccio, rendere i mock membri della classe di test di base e avere un metodo di impostazione comune per quelli. –