UpdateModel ne peut pas renvoyer un résultat correct en utilisant la valeur de collecte de formulaires simulés
-
29-10-2019 - |
Question
J'ai deux méthode de test appelant le contrôleur:
Celui-ci est passé:
[Test]
public void EditAction_Should_Redirect_When_Update_Successful()
{
// Arrange
var controller = CreatePaperControllerAs("SomeUser");
const int id = 2;
FormCollection formValues = new FormCollection() {
{ "IM_Paper.Title", "Another value" },
{ "IM_Paper.Abstract", "Another description" }
};
controller.ValueProvider = formValues.ToValueProvider();
// Act
var result = controller.Edit(id, formValues) as RedirectToRouteResult;
// Assert
Assert.AreEqual("Details", result.RouteValues["Action"]);
Assert.AreEqual(id, result.RouteValues["id"]);
}
Celui-ci échoue:
[Test]
public void EditAction_Should_Redisplay_With_Errors_When_Update_Fails()
{
// Arrange
var controller = CreatePaperControllerAs("SomeUser");
int id = 1;
FormCollection formValues = new FormCollection() {
{ "IM_Paper.Year","xxx"}
};
controller.ValueProvider = formValues.ToValueProvider();
// Act
var result = controller.Edit(id, formValues) as ViewResult;
// Assert
Assert.IsNotNull(result, "Expected redisplay of view");
Assert.IsTrue(result.ViewData.ModelState.IsValid, "Expected Errors");
}
Le résultat de l'action dans le contrôleur est
[HttpPost, Authorize]
public ActionResult Edit(int id, FormCollection collection)
{
IM_Paper paper = _paperRepository.GetPaperById(id);
if (!paper.IsPostedByUser(User.Identity.Name))
return View("InvalidOwner");
try
{
UpdateModel(paper, "IM_Paper" );
_paperRepository.Save();
return RedirectToAction("Details", new { id = paper.PaperId });
}
catch
{
return View(paper);
}
}
Cependant, le bloc d'essai ne capte jamais une exception (le "im_paper.year" devrait être un int). Ainsi, le contrôleur renvoie toujours le résultat de l'action comme redirecttoaction. Même pour le premier, les données dans la mémoire n'ont pas changé.
Avez-vous une idée de la raison pour laquelle cela se produit? Pour la classe "im_paper", j'ai utilisé le générateur POCO et généré à partir d'un cadre d'entité. La classe ressemble à ceci:
public partial class IM_Paper
{
#region Primitive Properties
public virtual int PaperId
{get;set;}
public virtual string Author
{get;set;}
public virtual Nullable<int> Year
{get;set;
} ...
La solution
J'ai trouvé la réponse, je n'ai pas limité les attributs à la classe IM_Paper.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow