为了模拟文件的提交(出于测试目的),我需要在Controller中向Request.Files
添加一个文件。
Request.Files
是HttpFileCollectionBase
,但它似乎没有公开向其添加文件的方法。
如何将文件添加到此集合中?
格雷格
答案 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服务器环境相关联。