将图像上传到Cloud UnitTest

时间:2011-12-06 13:03:37

标签: c# unit-testing mstest cloud-storage

我正在尝试将图片上传到云端,我希望能够对此进行测试, 这是我已经尝试过的,我真的不完全明白我在做什么,所以如果有人能告诉我该怎么做,我将不胜感激。

到目前为止,我已经包含了此方法的主要方法和该方法的测试。

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 个答案:

答案 0 :(得分:1)

我会说这不是一个真正的单元测试 - 你试图将一些东西上传到你无法控制的外部服务,并且不能保证结果将是相同的跑去跑。

您编写的是集成测试,它是对两个或多个软件组件如何协同工作的测试。在这种情况下,两个组件是

  • 您的代码
  • 云上传API

集成测试没有任何问题,但它们往往较慢(在这种情况下,由于将文件上传到云端),而且它们往往更脆弱。例如,如果云服务不可用,您的集成测试将会中断。代码中没有任何变化,测试中没有任何变化,但测试结果不同。

如果您想对UploadToCloud方法进行单元测试,我建议您首先将“云上传”功能包装在实现接口的类中,例如: ICloudUploader。然后,您可以模拟与您的云服务实际通信的部分,并确保您的代码的功能在您要测试的所有情况下都是正确的(成功上传,服务不可用,上传由于文件太大而失败,无论如何)。

对于模拟一个类,你可以自己滚动(编写一个实现你的接口的类,例如public class FakeCloudUploader : ICloudUploader),或者查看一个模拟框架,如MoqRhinoMocks

至于你提供的测试方法,它并没有真正测试方法的输出。它应该验证您从UploadToCloud返回的字符串是您期望的值。