2009-11-06 5 views
0

Dans mon application, j'ai un liant modèle personnalisé que je mis à la DefaultBinder dans le global.asax:unité d'essai un contrôleur avec un liant de modèle personnalisé

ModelBinders.Binders.DefaultBinder = new XLDataAnnotationsModelBinder(); 

Lors de l'écriture des tests unitaires pour les contrôleurs que je dois faire que le contrôleur utilise le classeur de modèle personnalisé mais je ne sais pas comment le faire.

Mon test ressemble à ceci:

[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 = "[email protected]"; 

    // Test 
    var result = controller.Details(param); 

    // Assert 
    Assert.IsTrue(result is ViewResult); // will be ViewResult if failed.... 
    Assert.IsFalse(((ViewResult)result).ViewData.ModelState.IsValid); 
} 

Avec ce test unitaire le contrôleur se termine à l'aide du DefaultModelBinder. Que puis-je ajouter à ce test pour m'assurer que le contrôleur utilise le classeur de modèle personnalisé?

Répondre

3

Scott Hanselman a fait un blog lié à cela il y a un certain temps:

Splitting DateTime - Unit Testing ASP.NET MVC Custom Model Binders

La partie qui vous intéresses est au fond du poste sous la rubrique « Test du liant Modèle personnalisé ». Fondamentalement, vous instanciez un ModelBindingContext, puis instanciez votre Modelbinder et appelez Bind() sur votre Modelbinder en transmettant le ModelBindingContext que vous avez créé (et le contexte du contrôleur si nécessaire).

Voici une autre question à SO qui contient également les informations dont vous avez besoin (même si vous ne l'utilisez QMC):

How to Unit Test a custom ModelBinder using Moq?

+0

Le lien Hanselman semble être ce que je suis à la recherche donc je marqué ceci comme la réponse. Je ne l'ai pas +1 parce que la réponse réelle n'est pas sur stackoverflow (ce qui signifie que si le site de hansleman est tombé en panne pour une raison quelconque, cette réponse n'a aucune valeur). –

Questions connexes