I Test di unità (xUnit) un ASP.NET Controller Mvc con un input personalizzato modello?
-
26-09-2019 - |
Domanda
Sto avendo un momento difficile trovare informazioni su ciò che mi aspetto di essere un abbastanza semplice scenario.Sto cercando di unità di prova di un'Azione sul mio ASP.NET Mvc 2 Controller che utilizza un input personalizzato modello w/ DataAnnotions.Il mio framework di test è xUnit, come indicato nel titolo.
Ecco la mia custom Modello Di Input:
public class EnterPasswordInputModel
{
[Required(ErrorMessage = "")]
public string Username { get; set; }
[Required(ErrorMessage = "Password is a required field.")]
public string Password { get; set; }
}
E qui è il mio Controller (ha preso un po ' di logica per semplificare per questo ex.):
[HttpPost]
public ActionResult EnterPassword(EnterPasswordInputModel enterPasswordInput)
{
if (!ModelState.IsValid)
return View();
// do some logic to validate input
// if valid - next View on successful validation
return View("NextViewName");
// else - add and display error on current view
return View();
}
E qui è il mio xUnit Fatto (anche semplificata):
[Fact]
public void EnterPassword_WithValidInput_ReturnsNextView()
{
// Arrange
var controller = CreateLoginController(userService.Object);
// Act
var result = controller.EnterPassword(
new EnterPasswordInputModel
{
Username = username, Password = password
}) as ViewResult;
// Assert
Assert.Equal("NextViewName", result.ViewName);
}
Quando ho eseguito il mio test ottengo il seguente errore sul mio test fatto quando si cerca di recuperare il controller di risultato (Act sezione):
System.NullReferenceException: Object reference not set to an instance of an object.
Grazie in anticipo per qualsiasi aiuto che si può offrire!
Soluzione
Penso di essere in pista per una soluzione però.Qui è il cambiamento che ho fatto per il mio controller:
Originale
if (!ModelState.IsValid)
return View();
Aggiornato
if (!TryUpdateModel(loginInput))
return View();
Sembra che il modello di associazione non è stato che si verificano durante il mio test.Sembra che il modello di associazione non avviene, a meno che un POST si verifica.Forzando il tentativo di associazione del modello sono stato in grado di ottenere il test per passare.
Nota:C'era anche un errore nella mia azione che è stata la causa della mia null originale di riferimento che mi ha causato durante il tentativo di capire perché il mio modello non era stato convalidato.
Riferimento:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
Altri suggerimenti
Stai dereferencing un'istanza nulla all'interno della vostra azione del controller. Probabilmente nel codice che tirò fuori a "semplificare" la questione. Guardate lo stack di chiamate nei risultati del test per capire cosa. Potrebbe essere necessario qualcosa di finto per il test.