1

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

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

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.");
    }
4

1 回答 1

1

我想说这不是真正的单元测试——您正在尝试将某些内容上传到您无法控制的外部服务,并且无法保证每次运行的结果都是相同的.

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

  • 你的代码
  • 云上传 API

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

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

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

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

于 2011-12-06T13:30:47.033 回答