[英]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.