簡體   English   中英

使用 IMemoryCache 擴展方法的單元測試方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM