2017-02-22 13 views
1

AWS S3バケットへのファイルアップロードが成功した場合、単体テストを行う最良の方法は何でしょうか?ユニットテストファイルをAWS S3にアップロード

今、私は次のことをやっている:

 [Test] 
     public void UploadFileToAWS() 
     { 
      // Arrange 
      var bucket = "bucketName"; 
      var keyName = "test_upload.txt"; 
      var originalFile = new FileStream(@"C:\test.txt", FileMode.Open, FileAccess.Read); 

      // Act 
      var aws = new AmazonWebServicesUtility(bucket); 
      var awsUpload = aws.UploadFile(keyName,originalFile); 

      // Assert 
      Assert.AreEqual(true, awsUpload); 
     } 

の方法UploadFile()がAWSにアップロードするのFileStreamを使用してAWS documentationから取られています。

このアプローチについて私が気に入らないのは、ローカルファイル(C:\ test.txt)が必要なことです。バージョンコントロールを介して共有するとこのユニットテストは機能しません。
このユニットテストを変更してローカルファイルに依存しないようにするにはどうすればよいですか?

System.IO.Path.GetTempPath()を使用してアップロードして単体テストの比較として使用する一時的なテキストファイルを作成することは意味がありますか?

私はユニットテストにかなり新しいですので、私はあなたが

はどうもありがとうございました:-)に私を指すことができ、任意の方向のために幸せです!

+2

なぜあなたはファイルストリームに依存することなく、独自の 'Stream'を作成することはできません(例:のhttp:/ /stackoverflow.com/a/1879470/1663001)?あなたはそれをダウンロードしてテストすることができ、既知の値も含まれています。 – DavidG

+0

素晴らしい!それはまさに私が探していたものです。ありがとうDavidG :-) – jrn

答えて

2

ディスク上のファイルからストリームを作成する代わりに、代わりにMemoryStreamを使用してください。このように、挿入するテキストはコード内の定数であり、ファイルをダウンロードしてラウンドトリッププロセス全体をテストするためにも使用できます。だから、this answerからコードを取る:

private const string StringToTestWith = "some sort of test string goes in here"; 

[Test] 
public void UploadFileToAWS() 
{ 
    // Arrange 
    var bucket = "bucketName"; 
    var keyName = "test_upload.txt"; 
    var uploadFile = GenerateStreamFromString(StringToTestWith); 

    // Act 
    var aws = new AmazonWebServicesUtility(bucket); 
    var awsUpload = aws.UploadFile(keyName, uploadFile); 

    // Assert 
    Assert.AreEqual(true, awsUpload); 
} 

private static Stream GenerateStreamFromString(string s) 
{ 
    var stream = new MemoryStream(); 
    var writer = new StreamWriter(stream); 
    writer.Write(s); 
    writer.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

そして今、あなたもこのテストを書くことができます。

[Test] 
public void DoesDownloadGetTheCorrectValue() 
{ 
    //This implementation is up to you 
    var downloadedString = GetFileFromAWSSomehow(); 

    Assert.AreEqual(downloadedString, StringToTestWith); 
} 
+2

参照用:@DavidGが言及した 'GetFileFromAWSSomehow()'メソッドを実装する方法を探している人は:[こちらはAWSドキュメントです](http://docs.aws.amazon.com /AmazonS3/latest/dev/RetrievingObjectUsingNetSDK.html)を参照してください。 – jrn

関連する問題