簡體   English   中英

Azure Blob 存儲:模擬 CloudBlobContainer

[英]Azure Blob Storage: Mocking CloudBlobContainer

我正在嘗試對一個將文件上傳到 Azure Blob 存儲的類進行單元測試。 上傳方法以CloudBlobContainer作為輸入。 調用_storageContainer.Object.GetBlockBlobReference() ,會拋出 System.NullReferenceException。 有人可以幫我嘲笑這個嗎?

單元測試代碼:

[TestClass()]
public class BlobStorageServiceUploadUnitTest
{
    private static BlobStorageService _service;
    private static Mock<CloudBlobContainer> _storageContainer;
    private static List<FileType> _extensions;
    private static int _maxSize;

    [ClassInitialize]
    public static void Setup_Service(TestContext context)
    {
        _extensions = new List<FileType> { FileType.Image };
        _maxSize = 2048;

        _storageContainer = new Mock<CloudBlobContainer>();

        _service = new BlobStorageService(new Mock<BEntitiesContainer>().Object, _storageContainer.Object);
    }

    [TestMethod()]
    public void When_FileIsDeleted()
    {
        var file = CreateMockFile("test.jpg", 500000);
        var blob = _storageContainer.Object.GetBlockBlobReference("deleteTest.jpg");
        blob.UploadFromStream(file.Object.InputStream);

        _service.DeleteFromStorage("deleteTest.jpg");

        var blobs = _storageContainer.Object.ListBlobs();
        Assert.AreEqual(0, blobs.Count());
    }


    public Mock<HttpPostedFileBase> CreateMockFile(string fileName, int sizeInBytes)
    {
        var file = new Mock<HttpPostedFileBase>();
        var stream = new MemoryStream();
        var bmp = new Bitmap(1, 1);
        var graphics = Graphics.FromImage(bmp);
        graphics.FillRectangle(Brushes.Black, 0, 0, 1, 1);
        bmp.Save(stream, ImageFormat.Jpeg);

        file.Setup(pf => pf.InputStream).Returns(stream);
        file.Setup(f => f.FileName).Returns(fileName);
        file.Setup(f => f.ContentLength).Returns(sizeInBytes);

        return file;
    }
}

測試類:

public class BlobStorageService : BaseRepository<User>
{
    private CloudBlobContainer _storageContainer;

    public BlobStorageService(BEntitiesContainer context, CloudBlobContainer storageContainer) : base(context)
    {
        Context = context;
        _storageContainer = storageContainer;
    }

    public void DeleteFromStorage(string fileName)
    {
        _storageContainer.GetBlockBlobReference(fileName).DeleteIfExists();
    }
}

您只能做的一件事是將 CloudBlobContainer 操作移動到具有抽象實現的單獨服務。 在這種情況下,您將能夠模擬該服務,而根本不需要接觸 Azure 類。

例如:

public interface IAzureServiceWrapper
{
    CloudBlockBlob GetBlockBlobReference(CloudBlobContainer storageContainer, string fileName);
}

public class AzureServiceWrapper : IAzureServiceWrapper
{
    public CloudBlockBlob GetBlockBlobReference(CloudBlobContainer storageContainer, string fileName)
    {
         storageContainer.GetBlockBlobReference(fileName).DeleteIfExists();
    }
}

在這種情況下,模擬 AzureServiceWrapper 將非常容易,該解決方案將解決在單元測試中使用 Azure 類的所有問題。 您只需要在 BlobStorageService 中使用 AzureServiceWrapper 而不是 CloudBlobContainer。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM