我正在为基于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);
}
}
答案 0 :(得分:2)
我认为单元测试FooTableStorageComponent
不会有多大意义,因为这些方法严重依赖于表操作和表实体。它是一个没有任何业务逻辑的简单存储库,因此集成测试更合适,因为它依赖于子系统。
您将为使用IFooComponent
的单元测试提供虚假实现。