web-dev-qa-db-ja.com

ASP.NET Core 1 MVC 6でユニット/統合テスト用のIFormFileをモックする方法は?

ASP.NET Core 1でファイルをアップロードするためのテストを記述したいのですが、IFormFileから派生したオブジェクトをモック/インスタンス化するための素晴らしい方法が見つからないようです。これを行う方法に関する提案はありますか?

ありがとう。

23
Kasper P

次のようなコントローラがあると仮定します。

_public class MyController : Controller {
    public Task<IActionResult> UploadSingle(IFormFile file) {...}
}
_

...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));
    }
}
_
40
Nkosi

実際のメモリ内インスタンスを作成しないのはなぜですか

 IFormFile file = new FormFile(new MemoryStream(Encoding.UTF8.GetBytes("This is a dummy file")), 0, 0, "Data", "dummy.txt");
16
harishr

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