如何在ASP.NET Core 1 MVC 6中模拟IFormFile进行单元/集成测试?

Kas*_*r P 19 c# asp.net unit-testing asp.net-core-mvc

我想编写用于在ASP.NET Core 1中上传文件的测试,但似乎找不到一种模拟/实例化从IFormFile派生的对象的好方法.有关如何做到这一点的任何建议?

谢谢.

Nko*_*osi 39

假设你有一个类似的控制器..

public class MyController : Controller {
    public Task<IActionResult> UploadSingle(IFormFile file) {...}
}
Run Code Online (Sandbox Code Playgroud)

... IFormFile.OpenReadStream()使用被测方法访问的位置.您可以使用Moq模拟框架创建测试来模拟流数据.

[TestClass]
public class IFormFileUnitTests {
    [TestMethod]
    public async Task Should_Upload_Single_File() {
        //Arrange
        var fileMock = new Mock<IFormFile>();
        //Setup mock file using a memory stream
        var content = "Hello World from a Fake File";
        var fileName = "test.pdf";
        var ms = new MemoryStream();
        var writer = new StreamWriter(ms);
        writer.Write(content);
        writer.Flush();
        ms.Position = 0;
        fileMock.Setup(_ => _.OpenReadStream()).Returns(ms);
        fileMock.Setup(_ => _.FileName).Returns(fileName);
        fileMock.Setup(_ => _.Length).Returns(ms.Length);

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

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

        //Assert
        Assert.IsInstanceOfType(result, typeof(IActionResult));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @FreedomDeveloper设置模拟以返回流`fileMock.Setup(_ =&gt; _.Length).Returns(ms.Length)`的长度。 (4认同)

Ras*_*ing 16

添加带有固定长度的 harishr 答案(这是我的 Blob.Upload() 工作所需的)。

private IFormFile CreateTestFormFile(string p_Name, string p_Content)
{
    byte[] s_Bytes = Encoding.UTF8.GetBytes(p_Content);

    return new FormFile(
        baseStream: new MemoryStream(s_Bytes),
        baseStreamOffset: 0,
        length: s_Bytes.Length,
        name: "Data",
        fileName: p_Name
    );
}
Run Code Online (Sandbox Code Playgroud)


har*_*shr 9

为什么不创建实际的内存中实例

 IFormFile file = new FormFile(new MemoryStream(Encoding.UTF8.GetBytes("This is a dummy file")), 0, 0, "Data", "dummy.txt");
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,我的意思是无法读取文件的内容。相反,我必须设置流的长度。我已将文件的内容存储到名为“content”的字符串变量中。因此“FormFile”的第三个参数是“content.Length”。 (3认同)