Asp.net mvc 如何将文件添加到Request.Files

Asp.net mvc 如何将文件添加到Request.Files,asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,为了模拟文件的提交(出于测试目的),我需要向控制器中的Request.Files添加一个文件 Request.Files是一个HttpFileCollectionBase,但它似乎没有公开向其中添加文件的方法 如何将文件添加到此集合 格雷格 我需要向控制器中的Request.Files添加一个文件 通常,控制器不应该依赖于HttpContext。已发布的文件将作为方法参数包含在控制器操作本身中。这样,单元测试就可以为这些参数提供模拟(使用您选择的任何模拟库)。如您所见,任何与控制器中的HttpC

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

Request.Files
是一个
HttpFileCollectionBase
,但它似乎没有公开向其中添加文件的方法

如何将文件添加到此集合

格雷格

我需要向控制器中的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服务器上下文相耦合。

通常,发布的文件是控制器上的一个参数,然后可以对其进行模拟以进行测试。听起来控制器代码与
HttpContext
相耦合,正如您所见,这使得测试变得困难。@David,您完全正确。问题是一个组件(我没有它的源代码)直接在HttpContext之外执行文件的实际处理。因此,我试图在其中填充一个文件。在这种情况下,理想的方法是模拟该组件以删除依赖关系。(不仅依赖于
HttpContext
,还依赖于该第三方组件。)这样,您就可以在不依赖外部依赖的情况下测试逻辑。为了测试组件本身(这不必要,供应商应该处理),这更像是集成测试,或者可能是手动QA测试
HttpContext
是出了名的难以手动调用的,它在设计上与web服务器上下文紧密耦合。我将修改我正在尝试做的事情。如果您想添加一些内容作为答案,我会将其标记为已回答。