2017-02-22 50 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()使用一個FileStream上傳到AWS從AWS documentation取。

我不喜歡這種方法,它需要一個本地文件(C:\ test.txt) - 所以如果通過版本控制共享這個單元測試將無法工作。
我該如何修改這個單元測試,使其不依賴本地文件?

使用System.IO.Path.GetTempPath()來創建一個臨時文本文件,我可以在單元測試中上傳和使用它作爲比較嗎?

我是相當新的單元測試,所以我很高興爲任何方向,你可以點我:-)

非常感謝您!

+2

你爲什麼不能,而不依賴於文件流(例如HTTP創建自己的'Stream' /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)從AWS檢索文件。 – jrn