首页 > 解决方案 > 具有存储库模式和 xUnit 的 Azure 表存储 C#

问题描述

如何使用 Azure 存储实现存储库模式,它是否应该支持 xUnit 测试和模拟对象?我正在研究 xUnit 测试用例,不幸的是,由于无法模拟 CloudStorageAccount 和 CloudTableClient,我无法编写单元测试用例。

示例代码:-

public abstract class TableStorageRepository 
{
    private readonly IConfiguration _config;
    public CloudStorageAccount _cloudStorageAccount;
    public CloudTableClient _tableClient;
    protected CloudTable _table;

    public TableStorageRepository (IConfiguration configuration)
    {
         _config = configuration;
         _cloudStorageAccount = CloudStorageAccount.Parse ("key");
         _tableClient = _cloudStorageAccount.CreateCloudTableClient (
              new TableClientConfiguration ());
    }

    public async Task<List<T>> GetEntitiesAsync (TableQuery<T> query) 
    {
         _table = _tableClient.GetTableReference("Tablename");
         await _table.CreateIfNotExistsAsync ();
         TableContinuationToken token = null;
         var entities = new List<T> ();
         do 
         {
             var queryResult = await _table.ExecuteQuerySegmentedAsync (query, token);
             entities.AddRange (queryResult.Results);
             token = queryResult.ContinuationToken;
          } while (token != null);

          return entities;
     }
}

标签: c#azurexunit

解决方案


用于模拟 CloudTableClient 。请按照以下片段

var cloudTableMock = new Mock(new Uri("http://unittests.localhost.com/FakeTable") , (TableClientConfiguration)null);

列出 deviceUserLinkDataList = new List(); DeviceUserLinkData deviceUserLinkData = new DeviceUserLinkData();

        deviceUserLinkDataList.Add(deviceUserLinkData);

        var ctor = typeof(TableQuerySegment<DeviceUserLinkData>)
            .GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)
            .FirstOrDefault(c => c.GetParameters().Count() == 1);

var mockQuerySegment = ctor.Invoke(new object[] { deviceUserLinkDataList }) as TableQuerySegment;

        cloudTableMock.Setup(table => table.ExecuteQuerySegmentedAsync(It.IsAny<TableQuery<DeviceUserLinkData>>(), null))
            .Returns(Task.FromResult(mockQuerySegment));

        var cloudTableClientMock = new Mock<CloudTableClient>(new Uri("http://localhost")
            , new StorageCredentials(accountName: "blah", keyValue: "blah")
            , (TableClientConfiguration)null);  
                                                

      
        cloudTableClientMock.Setup(client => client.GetTableReference(It.IsAny<string>()))
            .Returns(cloudTableMock.Object);

这里 DeviceUserLinkData 是用户定义的类,ExecuteQuerySegmentedAsync 返回 DeviceUserLinkData 的列表


推荐阅读