繁体   English   中英

Azure 表存储 c# 与存储库模式和 xUnit

[英]Azure table storage c# with repository pattern and xUnit

如何使用 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;
     }
}

第一的。 接受单元测试的用途。 它用于测试代码的单个单元。 m guessing you don在这种情况下并不真正关心持久性。 由于您实际测试的代码可能更进一步。 所以考虑到这一点 - 让我们模拟持久层,以便您可以在其他地方使用它。

让 TableStorageRepository 实现一个接口。

ITableStorageRepository {
TableStorageRepository (IConfiguratin configuration);
Task<List<T>> GetEntitiesAsync (TableQuery<T> query);
}

用法例如:

#Arrange
    var mock = new Mock<ITableStorageRepository>();

mock.Setup(.... etc.

var systemUnderTest = new TheServiceImActuallyTesting(mock.Object);

#Act

var resp = systemUnderTest.GetStuff(query);

#Assert

你的断言在这里

对于 CloudTableClient 的 Mocking。 请按照以下片段

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 是用户定义的 class 和 ExecuteQuerySegmentedAsync 返回 DeviceUserLinkData 的列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM