Unità testare un controller con modello personalizzato legante
-
18-09-2019 - |
Domanda
Nella mia domanda ho un modello personalizzato legante che ho impostato al DefaultBinder nel Global.asax:
ModelBinders.Binders.DefaultBinder = new XLDataAnnotationsModelBinder();
Durante la scrittura di unit test per i controllori ho bisogno di assicurarsi che il controller utilizza il modello personalizzato legante, ma non so come fare.
Il mio test è simile al seguente:
[Test]
public void Details_Post_Action_Fails_To_Change_Email_Address_With_Duplicate()
{
// Setup
var controller = new AccountController();
controller.SetFakeControllerContext();
var param = Customer.Load(30005);
param.EmailAddress = "foo@bar.com";
// Test
var result = controller.Details(param);
// Assert
Assert.IsTrue(result is ViewResult); // will be ViewResult if failed....
Assert.IsFalse(((ViewResult)result).ViewData.ModelState.IsValid);
}
Con questo test unità controllore finisce con il DefaultModelBinder. Cosa posso aggiungere in questa prova per garantire il controller utilizza il modello personalizzato legante?
Soluzione
Scott Hanselman ha fatto un post relativo a questo qualche tempo fa:
DateTime Splitting - Unit Testing ASP.NET MVC personalizzate Leganti Girl
La parte che avrebbe interesse è in fondo al post sotto "Prova del modello personalizzato Binder". In sostanza si crea un'istanza di un ModelBindingContext, quindi istanziare la vostra Modelbinder e chiamata Bind () sul tuo Modelbinder passando il ModelBindingContext si è creato (e il contesto di controllo se necessario).
Questa è un'altra domanda a SO che contiene anche le informazioni necessarie (anche se non si sta usando Moq):
Come unit test un ModelBinder personalizzato utilizzando Moq?