【发布时间】:2010-11-29 13:43:02
【问题描述】:
我有一个返回 FileContentResult 或 NotModifiedResult 的操作,这是一个自定义结果类型,返回 HTTP 304 以指示请求的资源尚未被修改,如下所示:
[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;
}
}
此操作需要访问 Response 对象,该对象在测试期间当然不存在,因此使此操作无法测试。我可以在它周围添加条件语句,以便它在测试期间运行,但是我无法测试是否正确设置了标头。
有什么办法可以解决这个问题?
仅供参考,如果此操作返回 null,ReplaceMissingPicture 过滤器将返回特定资源,以出于同样的原因将 MapPath() 调用保持在控制器之外。
【问题讨论】:
-
测试方法中的controllerInstance.HttpContext.Response.Headers["ETag"]怎么样?
-
如果您在单元测试期间想要一个 HttpContext,您必须特别模拟它。这里的重点是使您的操作方法不依赖于 HttpContext。
标签: asp.net-mvc