2017-02-22 7 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 documentation, используя FileStream для загрузки в АМС.

Что мне не нравится в этом подходе, так это то, что ему нужен локальный файл (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

Только для справки: если кто-то ищет, как реализовать метод GetFileFromAWSSomehow(), который @DavidG упомянул: [здесь есть документация AWS] (http://docs.aws.amazon.com /AmazonS3/latest/dev/RetrievingObjectUsingNetSDK.html) по извлечению файлов из AWS. – jrn

Смежные вопросы