Je vérifie ModelState.IsValid
ma méthode d'action de contrôleur qui crée un employé comme ceci:
[HttpPost]
public virtual ActionResult Create(EmployeeForm employeeForm)
{
if (this.ModelState.IsValid)
{
IEmployee employee = this._uiFactoryInstance.Map(employeeForm);
employee.Save();
}
// Etc.
}
Je veux me moquer de cela dans ma méthode de test unitaire en utilisant Moq Framework. J'ai essayé de me moquer de ça comme ça:
var modelState = new Mock<ModelStateDictionary>();
modelState.Setup(m => m.IsValid).Returns(true);
Mais cela jette une exception dans mon cas de test unitaire. Est-ce que quelqu'un pourrait m'aider?
c#
asp.net-mvc
unit-testing
mocking
moq
Mazen
la source
la source
Le seul problème que j'ai avec la solution ci-dessus est qu'elle ne teste pas réellement le modèle si je définis des attributs. J'ai configuré mon contrôleur de cette façon.
L'objet modelBinder est l'objet qui teste la validité du modèle. De cette façon, je peux simplement définir les valeurs de l'objet et le tester.
la source
La réponse d'uadrive m'a pris une partie du chemin, mais il y avait encore des lacunes. Sans aucune donnée dans l'entrée de
new NameValueCollectionValueProvider()
, le classeur de modèles liera le contrôleur à un modèle vide, pas à l'model
objet.C'est très bien - sérialisez simplement votre modèle en tant que
NameValueCollection
, puis transmettez-le auNameValueCollectionValueProvider
constructeur. Enfin, pas tout à fait. Malheureusement, cela n'a pas fonctionné dans mon cas car mon modèle contient une collection etNameValueCollectionValueProvider
ne joue pas bien avec les collections.Le
JsonValueProviderFactory
vient à la rescousse ici, cependant. Il peut être utilisé par leDefaultModelBinder
tant que vous spécifiez un type de contenu de"application/json
"et que vous transmettez votre objet JSON sérialisé dans le flux d'entrée de votre requête (veuillez noter que ce flux d'entrée est un flux de mémoire, vous pouvez le laisser non disposé, en tant que mémoire stream ne conserve aucune ressource externe):la source