c# - 具有存储库模式和 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;
}
}
解决方案
用于模拟 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 的列表
推荐阅读
- wpf - 基于另一个使用数据模板的样式创建样式
- r - 检查数据框中的列是否具有相同的值
- ruby-on-rails - Rail 片段缓存如何使您的应用程序受益,即防止数据库调用?
- c# - 在字符串 C# 中查找子字符串的计数
- docker - 如何将一个 docker 服务与其他 docker 服务链接?
- firebase - 我如何知道 Service Worker 中是否激活了推送通知的权限?
- reactjs - Connect(EquipmentMetadata) 中的 mapStateToProps() 必须返回一个普通对象。而是收到未定义的
- ruby-on-rails - 如何在 Active Admin 中为用户/管理员设置某些行为授权
- powershell - PowerShell获取文件夹的已删除文件
- ubuntu - ffmpeg - Ubuntu - 隐蔽 mkv 到 mp4 和硬子