[英]Unit testing method that uses IMemoryCache extension method
我正在嘗試使用 MSTest 和 Moq 為使用 IMemoryCache 擴展方法的方法編寫單元測試。 情況:
public class ClassToTest
{
private IMemoryCache Cache { get; }
public ClassToTest(IMemoryCache cache)
{
Cache = cache;
}
public async Task<SomeType> MethodToTest(string key)
{
// Get is an extension method defined in Microsoft.Extensions.Caching.Memory
var ci = Cache.Get<CachedItem<T>>(key);
// Do stuff with cached item
}
}
我如何進行單元測試?
到目前為止,我嘗試過:
[TestMethod]
public void TestMethodToTest()
{
IServiceCollection services = new ServiceCollection();
services.AddMemoryCache();
var serviceProvider = services.BuildServiceProvider();
var memoryCache = serviceProvider.GetService<IMemoryCache>();
ClassToTest testClass = new ClassToTest(memoryCache);
}
這給了我以下錯誤:“‘IServiceCollection’不包含‘AddMemoryCache’的定義,並且找不到接受‘IServiceCollection’類型的第一個參數的可訪問擴展方法‘AddMemoryCache’(您是否缺少 using 指令或程序集)參考?)”。
有誰知道如何對這種方法進行單元測試? 最好不要改變方法本身。 有沒有標准的方法來做到這一點? 任何幫助是appriciated。
我認為你必須修改ClassToTest
。 您可以擁有一個Func<string, CachedItem<T>>
類型的屬性,該屬性被分配為在類的構造函數中使用擴展:
public Func<string, CachedItem<T>> GetFromCache { get; set; }
public ClassToTest(IMemoryCache cache)
{
Cache = cache;
GetFromCache = key => Cache.Get<CachedItem<T>>(key);
}
然后,當你想測試那個類時,你可以通過說:
ClassToTest testClass = new ClassToTest(memoryCache);
testClass.GetFromCache = key => /* something else */;
一般來說,擴展方法仍然只是靜態方法之上的語法糖,因此像ClassToTest
那樣使用它們會引入依賴關系並使代碼更難ClassToTest
測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.