J'ai une action qui renvoie soit un FileContentResult ou un NotModifiedResult, qui est un type de résultat personnalisé qui renvoie HTTP 304 pour indiquer que la ressource demandée n'a pas été modifiée , comme ceci:Comment obtenir et définir les en-têtes http dans une action, de manière testable
[ReplaceMissingPicture(Picture = "~/Content/Images/nothumbnail.png", MimeType = "image/png")]
public ActionResult Thumbnail(int id)
{
var item = Service.GetItem(id);
var requestTag = Request.Headers["If-None-Match"] ?? string.Empty;
var tag = Convert.ToBase64String(item.Version.ToArray());
if (tag == requestTag)
{
return new NotModifiedResult();
}
if (item.Thumbnail != null)
{
var thumbnail = item.Thumbnail.ToArray();
var mime = item.PictureMime;
Response.AppendHeader("ETag", tag);
return File(thumbnail, mime);
}
else
{
return null;
}
}
cette action doit accéder à l'objet de réponse, ce qui est bien sûr pas présent au cours des essais, de sorte que cette action fait invérifiable. Je pourrais ajouter des instructions conditionnelles autour de lui, de sorte qu'il s'exécute pendant le test, mais je ne peux pas tester les en-têtes correctement définis.
Quelle serait une solution à ce problème? FYI, le filtre ReplaceMissingPicture retourne une ressource spécifique dans le cas où null a été retourné à partir de cette action, pour garder l'appel MapPath() hors du contrôleur pour la même raison.
Qu'en est-controllerInstance .HttpContext.Response.Headers ["ETag"] dans une méthode de test? –
Vous devez en particulier vous moquer de cela si vous voulez un HttpContext pendant les tests unitaires. Le but ici est de faire en sorte que votre méthode d'action ne dépende pas de HttpContext. –