2017-05-23 22 views
1

私は以下の定義でAsp.net Coreメソッドを持っています。Asun.netコアのIFormFileフィールドのxunitテスト

[HttpPost] 
public IActionResult Upload(IFormFile file) 
{ 
    if (file == null || file.Length == 0) 
     throw new Exception("file should not be null"); 

    var originalFileName = ContentDispositionHeaderValue 
     .Parse(file.ContentDisposition) 
     .FileName 
     .Trim('"'); 

    file.SaveAs("your_file_full_address"); 
} 

私はIFormFileあざけることができるか、この機能のためのxUnitテストを作成したいですか?

更新:

コントローラー:

[HttpPost] 
public async Task<ActionResult> Post(IFormFile file) 
{ 

    var path = Path.Combine(@"E:\path", file.FileName); 

    using (var stream = new FileStream(path, FileMode.Create)) 
    { 
     await file.CopyToAsync(stream); 
    } 
    return Ok(); 
} 

のxUnitテスト

[Fact] 
public async void Test1() 
{ 
    var file = new Mock<IFormFile>(); 
    var sourceImg = File.OpenRead(@"source image path"); 
    var stream = new MemoryStream(); 
    var writer = new StreamWriter(stream); 
    writer.Write(sourceImg); 
    writer.Flush(); 
    stream.Position = 0; 
    var fileName = "QQ.png"; 
    file.Setup(f => f.OpenReadStream()).Returns(stream); 
    file.Setup(f => f.FileName).Returns(fileName); 
    file.Setup(f => f.Length).Returns(stream.Length); 

    var controller = new ValuesController(); 
    var inputFile = file.Object; 

    var result = await controller.Post(inputFile); 

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

しかし、私は、ターゲットパスに空の画像を得ました。

+1

可能にするために抽象化されなければなりませんか? 'Mock '?投稿する前に何を試しましたか? –

+2

[ASP.NET Core 1 MVC 6のユニット/統合テスト用にIFormFileをモックする方法](https://stackoverflow.com/questions/36858542/how-to-mock-an-iformfile-for) -a-unit-integration-test-in-asp-net-core-1-mvc-6) – Nkosi

+0

現在moqを試みていますが、コピーされたイメージは空です。私は元の投稿でさらに情報を追加します。 –

答えて

1

IFormFileの依存関係でテストする場合は、テストを行うために必要最小限のメンバーをモックしてください。上記のコントローラーでは、FileNameプロパティとCopyToAsyncメソッドが使用されます。それらはテストのためにセットアップする必要があります。

public async Task Test1() { 
    // Arrange. 
    var file = new Mock<IFormFile>(); 
    var sourceImg = File.OpenRead(@"source image path"); 
    var ms = new MemoryStream(); 
    var writer = new StreamWriter(ms); 
    writer.Write(sourceImg); 
    writer.Flush(); 
    ms.Position = 0; 
    var fileName = "QQ.png"; 
    file.Setup(f => f.FileName).Returns(fileName).Verifiable(); 
    file.Setup(_ => _.CopyToAsync(It.IsAny<Stream>(), It.IsAny<CancellationToken>())) 
     .Returns((Stream stream, CancellationToken token) => ms.CopyToAsync(stream)) 
     .Verifiable(); 

    var controller = new ValuesController(); 
    var inputFile = file.Object; 

    // Act. 
    var result = await controller.Post(inputFile); 

    //Assert. 
    file.Verify(); 
    //... 
} 

質問は単なるデモであることをコメントで述べたものの、ファイルシステムへの緊密な結合は、部品番号を持つ他の依存関係として、より良い柔軟性

+0

を実装する簡単なデモです: .Returns((ストリームストリーム、CancellationTokenトークン) ms.CopyToAsync(ストリーム)) ここで "ms"とは何ですか?エラーが発生します。 –

+0

@AbhishekB。それは私の一部のタイプミスでした。それを修正する答えを更新しました。 – Nkosi

関連する問題