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

本文关键字:端点 集成测试 文件 | 更新日期: 2023-09-27 18:01:08

从客户端上传文件时,可以在类型为HttpFileCollectionBasethis.Request.Files中找到该文件。

HttpFileCollectionBase包含HttpPostedFileBase条目。

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

  1. 这是上传的好方法吗从集成测试
  2. 如果这是一个好方法,我该如何模拟用Moq
  3. 如果这不是一个好方法,你能提出一个更好的方法吗

谢谢!

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

我对asp.net mvc一无所知,但看起来你需要做这样的事情来设置你的mock依赖项:

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);