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