5

Première étape; Je sais que je ne devrais pas avoir besoin de tester les internes de MVC mais j'ai vraiment besoin d'une suite de tests sur les données qui circulent dans notre système.Liaison de modèle de test dans ASP.NET MVC 2

Comment puis-je espérer, sans me moquer de tout le contexte HTTP, tester que objectA (collection de formulaires, dict, collection, objet, etc) est ou n'est pas conforme à objectAModel?

Je ne voudrais pas avoir à instancier mon contrôleur ou appeler l'action. Je veux simplement tester si mon nouvel objet invalide le modèle.

Je voudrais pouvoir simplement écrire

var modelState = new ModelBindingContext<objectAModel>().validate(objectA); 
+0

Je serais alors en mesure de tester comme: Assert.isTrue (new ModelBindingContext (). Validate (objectA)); – detroitpro

Répondre

2

Brad Wilson a une excellent post on DataAnnotations


Comment puis-je tester?

En utilisant les attributs DataAnnotations pour vos modèles déplace la validation sur les actions du contrôleur et en le liant modèle, ce qui signifie que vos tests unitaires pour vos actions de contrôleur seront simplifiées.

Lorsque vous écrivez des tests pour cela, vous devez vérifier trois choses:

  1. est le DataAnnotationsModelBinder enregistré comme liant par défaut? Vous ne le ferez qu'une seule fois pour l'ensemble de l'application, un peu comme les tests que vous écrivez.
  2. Mon modèle est-il correctement décoré avec les attributs DataAnnotations? Vous finirez par écrire des tests pour chaque attribut de validation que vous ajoutez à votre modèle.
  3. Est-ce que ma méthode d'action réagit correctement lorsque l'état du modèle est invalide? Vous n'aurez besoin d'écrire cette méthode qu'une fois par action.
+0

Cela vérifie uniquement que le modèle est décoré avec les attributs corrects. – detroitpro

0

Très simplement, vous pouvez mettre en œuvre une méthode qui tire le ModelMetadata pour le type de modèle, obtient le ModelValidator, et valide l'objet modèle.

public bool IsModelValid<T>(T model) where T : class 
{ 
    var metaData = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(T)); 
    var validator = ModelValidator.GetModelValidator(metaData, new ControllerContext()); 
    var validationResults = validator.Validate(model); 
    return 0 == validationResults.Count(); 
} 

Par « tout simplement », je veux dire cela ne veut pas nécessairement prendre toutes les configurations possibles à l'examen, mais vous pouvez obtenir un chèque de base sur la validité de votre modèle.

Questions connexes