如何实现Azure表存储以允许单元测试

时间:2018-02-13 09:39:21

标签: c# unit-testing azure mocking azure-table-storage

我正在为基于Azure表存储的持久性组件实现单元测试。该项目有多个表存储持久性组件,因此目前这些组件实现了一个抽象的TableStorageBase类来共享它们之间的公共代码。

假设我们有一个正在测试的类FooTableStorageComponent,它从表存储中检索Foo,如果它已过期(即时间戳超过7天),它会创建一个新的{{ 1}}。我想创建一个表存储存根,它总是给Foo一个超过7天的虚拟FooTableStorageComponent。然后,我想创建一个单元测试,检查是否创建了新的Foo。不幸的是,由于抽象的Foo类,我无法假装连接到Azure。

如何重新设计此结构以使其可单元测试?我应该如何对我的TableStorageBase进行单元测试?

抽象TableStorageBase类:

FooTableStorageComponent

正在测试的课程:

public abstract class TableStorageBase
{
    private readonly string tableName;
    protected readonly CloudStorageAccount storageAccount;
    protected TableRequestOptions DefaultTableRequestOptions { get; }
    protected OperationContext DefaultOperationContext { get; }
    public CloudTable Table
    {
        get
        {
            return storageAccount.CreateCloudTableClient().GetTableReference(tableName);
        }
    }

    public TableStorageBase(
        string connectionString,
        string tableName,
        LocationMode consistency)
    {
        this.tableName = tableName;
        storageAccount = CloudStorageAccount.Parse(connectionString);
        ServicePoint tableServicePoint = 
            ServicePointManager.FindServicePoint(storageAccount.TableEndpoint);
        tableServicePoint.UseNagleAlgorithm = false;
        tableServicePoint.ConnectionLimit = 500;
        DefaultTableRequestOptions = new TableRequestOptions()
        {
            PayloadFormat = TablePayloadFormat.JsonNoMetadata,
            MaximumExecutionTime = TimeSpan.FromSeconds(5),
            RetryPolicy = new LinearRetry(TimeSpan.FromMilliseconds(500), 3),
            LocationMode = consistency
        };

        DefaultOperationContext = new OperationContext();
        Table.CreateIfNotExists(DefaultTableRequestOptions, DefaultOperationContext);
    }
}

1 个答案:

答案 0 :(得分:2)

我认为单元测试FooTableStorageComponent不会有多大意义,因为这些方法严重依赖于表操作和表实体。它是一个没有任何业务逻辑的简单存储库,因此集成测试更合适,因为它依赖于子系统。

您将为使用IFooComponent的单元测试提供虚假实现。