其他分享
首页 > 其他分享> > CodeGo.net>如何将文件从集成测试上传到端点

CodeGo.net>如何将文件从集成测试上传到端点

作者:互联网

从客户端上载文件时,可以在this.Request.Files中找到该文件,其类型为HttpFileCollectionBase.

HttpFileCollectionBase包含HttpPostedFileBase条目.

这些对象的属性是只读的,因此我希望可以设置一些模拟.我的模拟请求将返回一个模拟HttpFileCollection,并且该集合将包含一个模拟HttpPostedFile.该对象上的InputStream属性将返回一个FileStream对象,该对象将在源代码管理中使用实际文件实例化.

>这是上传的好方法吗
从一个文件到端点
整合测试?
>如果这是一种好方法,我该如何模拟呢?
起订量?
>如果这不是一个好的方法,您能建议一个更好的方法吗?

谢谢!

解决方法:

我对asp.net mvc一无所知,但看起来您需要执行以下操作来设置模拟依赖项:

MemoryStream stream = new MemoryStream();

var mockFile = new Mock<HttpPostedFileBase>();
var mockFiles = new Mock<HttpFileCollectionBase>();
var mockRequest = new Mock<HttpRequestBase>();

mockFile.Setup(f => f.InputStream).Returns(stream);

// if for example, you index the file by name.
mockFiles.Setup(f => f[It.IsAny<string>()]).Returns(mockFile.Object);

mockRequest.Setup(r => r.Files).Returns(() => mockFiles.Object);

// write expected data to your memory stream, then instantiate your class 
// under test using the mockRequest.Object

在单元测试中,我将使用内存流而不是文件,但是文件流的工作原理相同.

如果您希望避免模拟并设置所有这些依赖项,则可以将它们放在UploadedFiles抽象的后面,使您的代码依赖于抽象,并且仅模拟UploadedFiles.这仅是Request.Files的一个薄包装,即可按名称获取文件流(或访问它们).这样做会更好,因为下游代码现在依赖于UploadedFiles,Stream和字符串,而不是HttpRequestBase,HttpFileCollectionBase,HttpPostedFileBase,Stream和字符串.

然后,安装程序将简化为以下形式:

MemoryStream stream = new MemoryStream();
var mockUploadedFiles = new Mock<UploadedFiles>();
mockUploadedFiles.Setup(u => u.GetFile(It.IsAny<string>())).Returns(stream);

标签:file-upload,moq,integration-testing,c,asp-net-mvc
来源: https://codeday.me/bug/20191102/1991571.html