Kenichiro Nakamura
Posted on June 10, 2022
Azure Files is great service to store files like local disk. I use C# SDK to access to the service, but unit testing was not straight forward.
Sample code
Let's imagine we have C# code as below, which returns all share names from the Azure Files. I use DI for ShareServiceClient here. The code is quite simple, eh?
using Azure.Storage.Files.Shares;
using Azure.Storage.Files.Shares.Models;
namespace AzureFilesSample;
public class AzureFileSampleService
{
private readonly ShareServiceClient shareServiceClient;
public AzureFileSampleService(ShareServiceClient shareServiceClient)
{
this.shareServiceClient = shareServiceClient;
}
public async Task<List<string>> GetFileSharesAsync()
{
List<string> fileShares = new List<string>();
await foreach (ShareItem item in shareServiceClient
.GetSharesAsync()
.WithCancellation(CancellationToken.None))
{
fileShares.Add(item.Name);
}
return fileShares;
}
}
Unit test
To write unit test for the above code, we need to mock ShareServiceClient. However, I cannot instantiate ShareItem as it only has internal constructor. After I browse its source code in github, I found ShareModelFactory class which let us instantiate related models.
This is the unit testing code. I use xUnit and moq library.
- Use ShareModelFactory to instantiate items
- Refer to Azure Mocking page to mock Azure response related object.
[Fact]
public async Task Test1()
{
Mock<ShareServiceClient> mockedShareServiceClient = new Mock<ShareServiceClient>();
ShareItem shareItem1 = ShareModelFactory.ShareItem("name1", ShareModelFactory.ShareProperties());
ShareItem shareItem2 = ShareModelFactory.ShareItem("name2", ShareModelFactory.ShareProperties());
ShareItem[] pageValues = new[] { shareItem1, shareItem2 };
Page<ShareItem> page = Page<ShareItem>.FromValues(pageValues, default, new Mock<Response>().Object);
Pageable<ShareItem> pageable = Pageable<ShareItem>.FromPages(new[] { page });
AsyncPageable<ShareItem> asyncPageable = AsyncPageable<ShareItem>.FromPages(new[] { page });
mockedShareServiceClient.Setup(x => x.GetSharesAsync(ShareTraits.None, ShareStates.None, null, CancellationToken.None))
.Returns(asyncPageable);
AzureFileSampleService service = new AzureFileSampleService(mockedShareServiceClient.Object);
var results = await service.GetFileSharesAsync();
Assert.Equal("name1", results.First());
Assert.Equal("name2", results.Last());
}
Summary
Obviously, Azure Mocking is a great resource for unit test but we need to see source code to figure out how to write unit test time to time.
Reference
Posted on June 10, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.