首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从物理文件实例化IFormFile

从物理文件实例化IFormFile
EN

Stack Overflow用户
提问于 2016-06-04 17:43:28
回答 3查看 24.8K关注 0票数 17

我有一个物理文件,我想将它传递给需要IFormFile类型(用于单元测试)的控制器方法。

我找不到任何实例化IFormFile接口的类,这意味着我无法创建一个。

如何将我的物理文件转换为IFormFile

EN

回答 3

Stack Overflow用户

发布于 2017-05-23 18:55:24

让我们假设您有一个接受IFormInfo的控制器方法

代码语言:javascript
复制
[HttpPost]
public Task<IActionResult> Upload(IFormFile file) {

    FileDetails fileDetails = null;
    using (var reader = new StreamReader(file.OpenReadStream())) {
        var fileContent = reader.ReadToEnd();
        ContentDispositionHeaderValue parsedContentDisposition = null;
        if (ContentDispositionHeaderValue.TryParse(file.ContentDisposition, out parsedContentDisposition)) {
            fileDetails = new FileDetails {
                Filename = parsedContentDisposition.FileName,
                Content = fileContent
            };
        }
    }

    return Task.FromResult((IActionResult)fileDetails);

}

使用Moq这样的模拟框架。您可以使用物理文件模拟IFormFile

代码语言:javascript
复制
[TestMethod]
public async Task Controller_Should_Upload_FormFile() {
    // Arrange.
    var fileMock = new Mock<IFormFile>();
    var physicalFile = new FileInfo("filePath");
    var ms = new MemoryStream();
    var writer = new StreamWriter(ms);
    writer.Write(physicalFile.OpenRead());
    writer.Flush();
    ms.Position = 0;
    var fileName = physicalFile.Name;
    //Setup mock file using info from physical file
    fileMock.Setup(_ => _.FileName).Returns(fileName);
    fileMock.Setup(_ => _.Length).Returns(ms.Length);
    fileMock.Setup(_ => _.OpenReadStream()).Returns(ms);
    fileMock.Setup(_ => _.ContentDisposition).Returns(string.Format("inline; filename={0}", fileName));
    //...setup other members as needed.

    var sut = new MyController();
    var file = fileMock.Object;

    // Act.
    var result = await sut.Upload(file);

    //Assert.
    Assert.IsInstanceOfType(result, typeof(IActionResult));
}

mock的排列甚至可以提取到一个扩展方法中以供重用。

代码语言:javascript
复制
public static IFormFile AsMockIFormFile(this FileInfo physicalFile) {
    var fileMock = new Mock<IFormFile>();
    var ms = new MemoryStream();
    var writer = new StreamWriter(ms);
    writer.Write(physicalFile.OpenRead());
    writer.Flush();
    ms.Position = 0;
    var fileName = physicalFile.Name;
    //Setup mock file using info from physical file
    fileMock.Setup(_ => _.FileName).Returns(fileName);
    fileMock.Setup(_ => _.Length).Returns(ms.Length);
    fileMock.Setup(m => m.OpenReadStream()).Returns(ms);
    fileMock.Setup(m => m.ContentDisposition).Returns(string.Format("inline; filename={0}", fileName));
    //...setup other members (code removed for brevity)


    return fileMock.Object;
}

并像这样使用

代码语言:javascript
复制
var physicalFile = new FileInfo("filePath");
IFormFile formFile = physicalFile.AsMockIFormFile();
票数 13
EN

Stack Overflow用户

发布于 2017-10-24 22:20:01

您可以实例化FormFile。它实现了IFormFile

.Net核心3.1中的示例(假设'file‘是物理路径和文件):

代码语言:javascript
复制
using var stream = new MemoryStream(File.ReadAllBytes(file).ToArray());
var formFile = new FormFile(stream, 0, stream.Length, "streamFile", file.Split(@"\").Last());
票数 13
EN

Stack Overflow用户

发布于 2020-02-12 17:44:25

我尝试了Nkosi的答案(使用.NET Core3.1),但它只返回"System.IO.FileStream“作为文件内容!可能是因为它将FileStream对象从physicalFile.OpenRead()写入输出流,而不是流的实际内容。这个修改后的版本适用于我:

代码语言:javascript
复制
    public static IFormFile AsMockIFormFile(this FileInfo physicalFile)
    {
        var fileMock = new Mock<IFormFile>();
        var ms = new MemoryStream();
        var writer = new StreamWriter(ms);
        using (FileStream fs = physicalFile.OpenRead())
        {
            byte[] b = new byte[1024];
            UTF8Encoding temp = new UTF8Encoding(true);

            while (fs.Read(b, 0, b.Length) > 0)
            {
                writer.WriteLine(temp.GetString(b));
            }
        }
        writer.Flush();
        ms.Position = 0;
        var fileName = physicalFile.Name;
        //Setup mock file using info from physical file
        fileMock.Setup(_ => _.FileName).Returns(fileName);
        fileMock.Setup(_ => _.Length).Returns(ms.Length);
        fileMock.Setup(m => m.OpenReadStream()).Returns(ms);
        fileMock.Setup(m => m.ContentDisposition).Returns(string.Format("inline; filename={0}", fileName));
        //...setup other members as needed

        return fileMock.Object;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37628743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档