如何为该单元测试实现模拟?

时间:2018-12-20 17:23:11

标签: c# azure unit-testing mocking moq

我需要为以下方法编写单元测试:

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()是否可以单元测试?

模拟子对象而不模拟其父对象是否可能/有效?

1 个答案:

答案 0 :(得分:2)

在使libs单元可测试时,他们采取了另一种方法。他们没有使用接口,而是将大多数方法虚拟化了。例如,CloudStorageAccount.CreateCloudBlobClient方法是virtual

您是那些模拟人,请参见the moq docs

或者您可以使用将接口中的实现包装起来的包装器并使用它。项目示例:this onethis one。这些将提供您可以嘲笑的界面,但是您必须更改现有代码库才能使用它们。