Jel*_*tra 5 c# unit-testing moq azure-blob-storage
我正在尝试对一个将文件上传到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
测试类:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 1
您唯一能做的一件事就是将 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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,模拟 AzureServiceWrapper 将非常容易,并且此解决方案将解决单元测试中使用的 Azure 类的所有问题。您只需在 BlobStorageService 中使用 AzureServiceWrapper 而不是 CloudBlobContainer 即可。
| 归档时间: |
|
| 查看次数: |
10210 次 |
| 最近记录: |