C# 控制器上下文的单元测试空引用异常

C# 控制器上下文的单元测试空引用异常,c#,unit-testing,asp.net-web-api,C#,Unit Testing,Asp.net Web Api,我正在尝试测试控制器,我想更改它的上下文,以便在请求中发布带有文件的消息。我的代码如下所示: System.Drawing.Image image = System.Drawing.Image.FromFile("..\\..\\Images\\UploadFileTest.jpg"); var converter = new System.Drawing.ImageConverter(); byte[] byteContent = (byte[]) converter.ConvertTo(i

我正在尝试测试控制器,我想更改它的上下文,以便在请求中发布带有文件的消息。我的代码如下所示:

System.Drawing.Image image = System.Drawing.Image.FromFile("..\\..\\Images\\UploadFileTest.jpg");

var converter = new System.Drawing.ImageConverter();
byte[] byteContent = (byte[]) converter.ConvertTo(image,typeof(byte[]));
var content = new ByteArrayContent(byteContent);
content.Headers.Add("Content-Disposition", "form-data");
var controllerContext = new HttpControllerContext()
{
    Request = new HttpRequestMessage() { Content = new MultipartContent() { content } }
};
var controller = new ActionsController();
controller.ControllerContext = controllerContext;
string fileUrl = controller.UploadFile();
但是,我在控制器中在线获得NullReferenceException:

var request = HttpContext.Current.Request;

我不确定您是否在Asp.net Mvc中使用此代码,但我假设您是。我认为最好的方法是在请求对象上写一个扩展方法,然后在这个方法中像这样发挥你的魔力

        public static class RequestMessageExtensions
    {
        internal static byte[] GetContent(this HttpRequestMessage request)
        {
            System.Drawing.Image image = System.Drawing.Image.FromFile("..\\..\\Images\\UploadFileTest.jpg");

        var converter = new System.Drawing.ImageConverter();
        byte[] byteContent = (byte[]) converter.ConvertTo(image,typeof(byte[]));
        var content = new ByteArrayContent(byteContent);
        content.Headers.Add("Content-Disposition", "form-data");

return content;
        }
  }
然后,您可以调用请求对象上的内容并访问您的数据

我希望这有帮助


感谢在生产环境中,承载应用程序的IIS服务器为每个请求填充当前的HttpContext。(特定上下文)

在UT中,没有任何内容被填充到HttpContext.Current中,这就是问题所在

您必须初始化HttpContext。当前:

HttpContext.Current = new HttpContext(new HttpRequest("", "http://blabla.com", ""),
                                      new HttpResponse(new StringWriter()));

还有一件事(以防万一你要伪造
HttpContext
HttpContext
是一个
密封的
类,您将无法使用代理工具(如
Rhino Mocks
/
Moq
伪造它。您必须使用代码编织工具,如
MsFakes
/
TypeMock隔离器
..

您可以通过以下方式伪造HttpContext:

希望一切顺利

var fake = Isolate.Fake.AllInstances<HttpContext>();
Isolate.Fake.StaticMethods<HttpContext>();
Isolate.WhenCalled(() => HttpContext.Current.Request).WillReturn(new HttpRequest("", "http://smth.com", ""));