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

标签 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()
}

它在我的“SomeController.cs” Controller 类中,当用户以简单的输入类型 ="file"HTML 输入提交文件时调用它。

P.S.:纯粹主义者当心:我知道这不是“纯粹的”单元测试,我只是想在测试环境中调用该方法并检查它是否在系统中进行了所需的更改。

谢谢大家对这个主题的任何启发, 山猫。

最佳答案

幸运的是,ASP.Net 团队在开始使用 MVC 并创建 System.Web.Abstractions 命名空间之前就考虑到了这一点。它是一系列基类,反射(reflect)了传统上无法测试的静态类,如 HttpWebRequest 类。

您要做的是依赖其中一个基类并进行一些依赖注入(inject),以便有效地模拟您的 session 。

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

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

关于c# - 如何对接收 FormCollection 以上传文件的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2327263/

相关文章:

c# - DataTemplate 是否可以按类型应用于 DataGridTemplateColumn?

javascript - JSON从js到MVC Controller

asp.net-mvc - MVC 中 HTML 帮助页面的链接

javascript - 如何测试连接到 RabbitMQ 的 promise ?

c# - Creators Update 后在 OnCollectionChanged 上获取线程访问异常

java - 警告 Xamarin android - 未提供 -tsa 或 -tsacert 并且此 jar 没有时间戳

c# - 即使更改了 azure blob 上的默认服务版本(为了设置内容处置 header ),也要继续获取旧版本

c# - @Html.Dropdownlist 列表未保存到数据库

firebase - 使用 firebase-functions-test、mocha 和 Emulator Suite 对 Firebase(云)函数进行单元测试时,为什么无法访问 .env 变量?

c# - 如何测试与数据库的连接是否成功建立?