我有一个用于联系人列表的静态异步缓存。在缓存内部,我正在调用我的存储库以从后端获取数据。我想模拟 ContactsRepository,但我需要将存储库作为参数传递并使用依赖注入。
根据文档,它不起作用,因为我需要一个类的实例来使用依赖注入。
public interface IContactsCache
{
Task<List<Contact>> GetContactsAsync(int inst, CancellationToken ct);
}
public class ContactsCache : IContactsCache
{
private static readonly object _syncRoot = new object();
private static readonly Dictionary<int, Task<List<Contact>>> _contactsTasks = new Dictionary<int, Task<List<Contact>>>();
public static Task<List<Contact>> GetContactsAsync(int inst)
{
return GetContactsAsync(inst, CancellationToken.None);
}
public static async Task<List<Contact>> GetCodeValuesAsync(int inst, CancellationToken ct)
{
Task<List<Contact>> task;
lock (_syncRoot)
{
if (_contactsTasks.ContainsKey(inst) && (_contactsTasks[inst].IsCanceled || _contactsTasks[inst].IsFaulted))
{
_contactsTasks.Remove(inst);
}
if (!_contactsTasks.ContainsKey(inst))
{
_contactsTasks[inst] = Task.Run(async () =>
{
using (var rep = new ContactsRepository())
{
return await rep.LoadAsync(inst, ct).ConfigureAwait(false);
}
});
}
task = _contactsTasks[inst];
}
var res = await task.ConfigureAwait(false);
lock (_syncRoot)
{
return res != null ? res.ToList() : null;
}
}
Task<List<CodeValue>> IContactsCache.GetContactsAsync(int inst, CancellationToken ct)
{
return GetContactsAsync(inst, ct);
}
}
最后我希望有这种用法,但我不知道如何更改缓存类或任何其他帮助之王都会非常有帮助。
但它行不通,我不知道如何正确编写单元测试。
我在使用此类存储库的地方有很多此类缓存。在这种情况下,是否有任何标准或最佳实践如何对静态异步缓存进行单元测试以及如何模拟存储库?
慕容森
相关分类