簡體   English   中英

我如何為這個單元測試實現模擬?

[英]How can I implement mock(s) for this unit test?

我需要為以下方法編寫單元測試:

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 單元測試,它會在blobRef.UploadTextAsync(fileContent)時拋出HttpException

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()是否可進行單元測試?

在不模擬其父對象的情況下模擬子對象是否可能/有效?

當要使libs單元可測試時,Microsoft采取了另一種方法。 這些類型沒有實現接口,而是將大多數方法虛擬化了。 例如, CloudStorageAccount.CreateCloudBlobClient方法是虛擬的。 您可以在Moq中嘲笑那些。

或者,您可以使用將實現包裝在接口中的包裝程序,然后使用該包裝程序。 參見例如Microsoft / Azure.Data.Wrapperspvredeveld / Azure.Storage.Wrappers 這些將提供一個您可以模擬的接口,但是您必須更改現有代碼庫才能使用它們。

也許你可以使用下面的代碼片段

Mock<CloudStorageAccount> obj = new Mock<CloudStorageAccount>();

然后你可以設置任何功能或屬性

暫無
暫無

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

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