如何对接收FormCollection的方法进行单元测试以上传文件?

Lyn*_*ler 6 c# asp.net-mvc unit-testing file-upload input-type-file

我想对以下方法进行单元测试:

public ActionResult StoreFile(FormCollection form, string _paginaAtual)
{
     Session["MySession"] = 1
     if (Request.Files["uploadedFiles"] != null)
         {
             //do something about the file
         }
     return View()
}
Run Code Online (Sandbox Code Playgroud)

它在我的"SomeController.cs"控制器类中,当用户在简单的input type ="file"HTML输入中提交文件时调用它.

PS:纯粹主义者要小心:我知道这不是一个"纯粹的"单元测试,我只想在测试环境中调用该方法并检查它是否在系统中进行了所需的改变.

谢谢大家对这个主题的任何启发,Lynx.

Jos*_*osh 5

幸运的是,ASP.Net 团队在开始使用 MVC 并创建 System.Web.Abstractions 命名空间之前就考虑到了这一点。它是一系列基类,反映了静态类,这些静态类无法像 HttpWebRequest 类那样以传统方式进行测试。

您想要做的是依赖这些基类之一并进行一些依赖项注入,以便有效地模拟您的会话。

HttpSessionStateBase _session;
public HttpSessionStateBase Session
{
    get{
        return _session ?? (_session = new HttpSessionStateWrapper(HttpContext.Current.Session));
    }
    set{
        _session = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

至于 FormCollection,您不必模拟它,因为您应该能够在 HttpContext 之外创建一个 FormCollection。Marcus Hammarberg 的博客上有一个很好的例子。