我需要为以下方法编写单元测试:
private async Task<bool> CreateFileAsync(string fileContent, string containerName, string fileName, string connectionString)
{
CloudStorageAccount cloudStorageAccount = await GetCloudStorageAccount(connectionString);
CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer containerRef = blobClient.GetContainerReference(containerName);
CloudBlockBlob blobRef = containerRef.GetBlockBlobReference(fileName);
await blobRef.UploadTextAsync(fileContent);
return true;
}
我需要编写一个xUnit单元测试,该测试将在调用HttpException
时抛出一个blobRef.UploadTextAsync(fileContent)
。
Microsoft.WindowsAzure.Storage.CloudBlockBlob : Microsoft.WindowsAzure.Storage.Blob.ICloudBlob
但是CloudStorageAccount
并没有实现接口,因此似乎无法模拟它。
以下是一些示例单元测试代码,这些代码基于我对模拟的理解,并针对此特定场景进行了组合:
var cloudBlockBlobMock = new Mock<ICloudBlob>();
cloudBlockBlobMock
.Setup(cbb => cbb.UploadTextAsync("test"))
.Throws<HttpException>();
var fileUploader = new FileUploader(cloudBlockBlobMock);
fileUploader.CreateFileAsync("test");
CreateFileAsync()
是否可以单元测试?
模拟子对象而不模拟其父对象是否可能/有效?
答案 0 :(得分:2)
在使libs单元可测试时,他们采取了另一种方法。他们没有使用接口,而是将大多数方法虚拟化了。例如,CloudStorageAccount.CreateCloudBlobClient
方法是virtual。
您是那些模拟人,请参见the moq docs
或者您可以使用将接口中的实现包装起来的包装器并使用它。项目示例:this one或this one。这些将提供您可以嘲笑的界面,但是您必须更改现有代码库才能使用它们。