如何将文件从集成测试上传到端点
本文关键字:端点 集成测试 文件 | 更新日期: 2023-09-27 18:01:08
从客户端上传文件时,可以在类型为HttpFileCollectionBase
的this.Request.Files
中找到该文件。
HttpFileCollectionBase
包含HttpPostedFileBase
条目。
这些对象的属性是只读的,所以我希望我可以设置一些mock。我的mock请求将返回一个mock HttpFileCollection
,而该集合将包含一个mockHttpPostedFile
。该对象的InputStream
属性将返回一个FileStream
对象,我将使用源代码管理中的实际文件实例化该对象。
- 这是上传的好方法吗从集成测试
- 如果这是一个好方法,我该如何模拟用
Moq
- 如果这不是一个好方法,你能提出一个更好的方法吗
谢谢!
我对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
进行一个薄薄的包装,就可以按名称(或访问它们的方式(获得文件流。这更好,因为下行代码现在依赖于UploadedFiles
、Stream
和string
,而不是HttpRequestBase
、HttpFileCollectionBase
、HttpPostedFileBase
、Stream
和string
。
然后设置会简化为这样的东西:
MemoryStream stream = new MemoryStream();
var mockUploadedFiles = new Mock<UploadedFiles>();
mockUploadedFiles.Setup(u => u.GetFile(It.IsAny<string>())).Returns(stream);