gpt4 book ai didi

c# - 如何从集成测试将文件上传到端点

转载 作者:行者123 更新时间:2023-11-30 15:43:43 25 4
gpt4 key购买 nike

当一个文件从客户端上传时,可以在this.Request.Files中找到,它是HttpFileCollectionBase类型。

HttpFileCollectionBase 包含 HttpPostedFileBase 条目。

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

  1. 这是上传的好方法吗一个文件到一个端点集成测试?
  2. 如果这是一个好方法,我该如何模拟它使用 Moq
  3. 如果这不是一个好方法,您能提出更好的方法吗?

谢谢!

最佳答案

我对 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 的一个薄包装器,就可以按名称(或者您访问它们的方式)获取文件流。这更好,因为下游代码现在依赖于 UploadedFilesStreamstring,而不是 HttpRequestBaseHttpFileCollectionBaseHttpPostedFileBaseStreamstring

设置将被简化为如下所示:

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

关于c# - 如何从集成测试将文件上传到端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6552075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com