Ho implementato un ViewFactory per separare la generazione di View Models dalla logica del controller. L'implementazione di ViewFactory include un insieme completo di test unitari che coprono tutti i percorsi.
Poiché si tratta di un refactoring del codice esistente, ho eseguito test unitari che coprono gli stessi scenari, con configurazioni similari simili a livello di controller.
Ora che ho spostato il codice nel View Factory, entrambi i set di unit test funzionano ancora, tuttavia, ora ho una duplicazione della logica di test e da un punto di vista della manutenzione, questo certamente non sembra giusto. Altri fattori potrebbero suggerire che anche questa non è una buona pratica.
Sto cercando di ridurre il numero di test nel controller ma sto lottando contro ciò che dovrei cercare di coprire. In parole povere, avrei un singolo mock di ViewFactory e la vista restituita in ActionResult sarebbe questa, quindi nessun valore reale (secondo me). Tuttavia, non avere nessun test anche non mi sta bene.
Ho intenzione di implementare le modifiche ad altri modelli di vista che espongono le proprietà in base alla convalida che cambieranno il modo in cui la vista presenta i dati, quindi ViewFactory genererebbe un modello con proprietà DuplicateIdFound e la visualizzazione mostrerebbe un errore. Per questi modelli, cercherò di testare gli scenari in quanto il valore di queste proprietà guiderà gli errori ModelState.
Il semplice test è abbastanza sotto, sapendo che i test di ViewFactory coprono il resto?
/// <summary>
/// GET PaymentDetails
/// </summary>
[TestMethod]
public void PaymentDetailsGet()
{
_mockViewFactory.Setup(x => x.CreateView<PaymentDetailsViewModel, PaymentDetailsViewModel>(It.IsAny<PaymentDetailsViewModel>()))
.Returns(new PaymentDetailsViewModel());
var controller = new AccountController(null, _mockPrincipalLoader.Object, _mockUserEntityService.Object, _mockPaymentService.Object, _mockPlanEntityService.Object, _mockBillingService.Object, _mockAlertsService.Object, _mockViewFactory.Object, _mockResetEntityService.Object, _mockMonitorEntityService.Object);
controller.ControllerContext = new ControllerContext(Helpers.CreateRequestContext(true), controller);
var result = (ViewResult)controller.PaymentDetails(Guid.NewGuid());
Assert.IsNotNull(result);
var message = controller.TempData["message"];
Assert.IsNull(message);
var model = result.Model as PaymentDetailsViewModel;
Assert.IsNotNull(model);
}
Si noti che nel contesto di questo metodo Controller, viene utilizzato solo ViewFactory, gli altri devono essere refactored;
[CustomAuthorize]
[HttpGet]
[CustomHttps]
public ActionResult PaymentDetails(Guid id)
{
//Get View from Factory
var viewModel = _viewFactory.CreateView<PaymentDetailsViewModel, PaymentDetailsViewModel>(new PaymentDetailsViewModel
{
UserId = CurrentUser.Id,
Reference = id
});
return View(viewModel);
}