![](/img/trans.png)
[英]How can I mock the Parent accessor of a faked TreeNode in a unit test?
[英]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.Wrappers或pvredeveld / Azure.Storage.Wrappers 。 這些將提供一個您可以模擬的接口,但是您必須更改現有代碼庫才能使用它們。
也許你可以使用下面的代碼片段
Mock<CloudStorageAccount> obj = new Mock<CloudStorageAccount>();
然后你可以設置任何功能或屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.