如何将文件添加到Request.Files

时间:2014-10-20 16:04:52

标签: asp.net-mvc asp.net-mvc-5

为了模拟文件的提交(出于测试目的),我需要在Controller中向Request.Files添加一个文件。

Request.FilesHttpFileCollectionBase,但它似乎没有公开向其添加文件的方法。

如何将文件添加到此集合中?

格雷格

1 个答案:

答案 0 :(得分:2)

  

我需要在Controller

中向Request.Files添加一个文件

通常,控制器不应该依赖HttpContext。发布的文件将作为方法参数包含在控制器操作本身中。这样单元测试可以为这些参数提供模拟(使用您选择的任何模拟库)。正如您所看到的,任何与控制器中HttpContext的耦合都会使测试变得非常困难。

但是,从您上面的评论中......

  

问题是组件(我没有源代码)直接从HttpContext执行文件的实际处理。

在这种情况下,不要将依赖关系视为HttpContext,而是关注第三方组件。在这种情况下, 是需要模拟的东西。如果它不是方法本身的参数,那么常见的模式是具有可设置的属性。也许在控制器上这么简单:

private SomeComponent _component;
public SomeComponent Component
{
    get
    {
        if (_component == null)
            _component = new SomeComponent();
        return _component;
    }
    set { _component = value; }
}

使用该组件的控制器中的代码可以直接引用该属性,而无需担心设置它。但是设置它的选项是可测试性的。然后,在调用使用该组件的任何操作之前,单元测试可以创建模拟并在控制器上将其设置为测试的“排列”步骤的一部分。

这样,代码就会与依赖关系隔离开来,并且可以自行测试。

另一方面,如果组件 您正在尝试测试的内容,那么这开始成为与供应商讨论的内容:)对于初学者,第三方组件应该通过以下方式进行测试供应商在发货之前当然。 (如果不是,那么值得质疑该组件的使用。)除此之外,如果你想测试它,那么听起来紧密耦合会使它更像是一个手动测试(这是当然,您可以自由地向供应商投诉。众所周知,HttpContext很难在测试中使用,因为它在设计上与Web服务器环境相关联。