Загрузить изображение в Cloud UnitTest - PullRequest
1 голос
/ 06 декабря 2011

Я пытаюсь загрузить изображение в облако и хочу проверить это, вот что я уже пробовал, я не совсем понимаю, что я делаю, поэтому, если кто-нибудь скажет мне, что делать, я буду благодарен.

Я включил основной метод для этого и тест этого метода до сих пор.

public static String UploadToCloud(string fileName)
    {
        try
        {
            SetUpConnection();
            #region Upload a File from local storage to the Cloud
            // Get a reference to the blob.
            blob = blobContainer.GetBlobReference("Images/" + fileName.Substring(fileName.LastIndexOf('\\')));
            blob.UploadFile(fileName);
            return blob.Uri.ToString();
            #endregion
        }
        catch (StorageClientException e)
        {
            Console.WriteLine("Storage client error encountered: " + e.Message);
            return "Upload failed";
        }
    }

/// <summary>
    ///A test for UploadToCloud
    ///</summary>
    [TestMethod()]
    public void UploadToCloudTest()
    {
        string fileName = "https://kevin.blob.core.windows.net/cp300/Images//skin-mole.jpg";
        Image expected = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\skin-mole.jpg");
        string actual;
        actual = CloudConnection.UploadToCloud(fileName);

        //Compares to images and checks they are exactly the same
        MemoryStream ms = new MemoryStream();
        expected.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        String expectedBitmap = Convert.ToBase64String(ms.ToArray());
        ms.Position = 0;
        actual.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        String actualBitmap = Convert.ToBase64String(ms.ToArray());

        Assert.AreEqual(expectedBitmap, actualBitmap); 

        //Assert.AreEqual(expected, actual);
        //Assert.Inconclusive("Verify the correctness of this test method.");
    }

1 Ответ

1 голос
/ 06 декабря 2011

Я бы сказал, что это на самом деле не модульный тест - вы пытаетесь загрузить что-то во внешнюю службу, которую вы не можете контролировать и не можете гарантировать, что результаты будут такими же, как у беги беги.

Вы написали интеграционный тест , который проверяет, как два или более программных компонента работают вместе. В этом случае два компонента

  • Ваш код
  • API загрузки в облако

В интеграционных тестах нет ничего плохого, но они, как правило, медленнее (в данном случае из-за загрузки файла в облако), и они, как правило, более хрупкие. Например, ваш интеграционный тест не будет работать, если облачный сервис недоступен. Ничего не изменилось в вашем коде, ничего не изменилось в вашем тесте, но результаты теста были другими.

Если вы хотите провести модульное тестирование своего метода UploadToCloud, я бы рекомендовал вам начать с оборачивания вашей функциональности «облачной загрузки» в классе, который реализует интерфейс, например, ICloudUploader. Затем вы можете смоделировать фрагменты, которые фактически связываются с вашим облачным сервисом, и убедиться, что функциональность вашего кода верна во всех ситуациях, которые вы хотите проверить (успешная загрузка, служба недоступна, загрузка не удалась) из-за слишком большого размера файла).

Для макетирования класса вы можете либо свернуть свой собственный (написать класс, который реализует ваш интерфейс, например, public class FakeCloudUploader : ICloudUploader, либо заглянуть в фальшивую среду, например Moq или RhinoMocks .

Что касается предоставленного вами метода тестирования, то на самом деле он не проверяет вывод метода. Должно быть подтверждено, что строка, которую вы возвращаете из UploadToCloud, является ожидаемым значением.

...