2016-04-26 32 views
5

ASP.NET Core 1でファイルをアップロードするためのテストを作成したいが、IFormFileから派生したオブジェクトを模擬したりインスタンス化したりするには良い方法が見つからないようだ。 これを行う方法に関するご提案はありますか?ASP.NET Core 1 MVC 6のユニット/統合テスト用にIFormFileをモックする方法は?

ありがとうございました。

+0

http://stackoverflow.com/help/how-to-ask – Kritner

+0

スタックオーバーフローへようこそ。これまでに試したことの[最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)を読んでください。そうすれば、人々はそれを使って問題を再現し、より良い回答を得ることができます。 – Nkosi

+0

インターフェイスを模擬してテスト用の方法を実行するように模擬フレームワークを使用することができます – Nkosi

答えて

10

..あなたのようなコントローラーを持っているIFormFile.OpenReadStream()がテスト対象のメソッドでアクセスされ

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

を...と仮定。 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)); 
    } 
} 
+1

@FreedomDeveloperは、ストリームの長さを返すようモックを設定します。 'fileMock.Setup(_ => _.Length).Returns ms.Length) ' – Nkosi

関連する問題