Метод модульного тестирования, использующий метод расширения IMemoryCache.

Я пытаюсь написать модульный тест, используя 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», и не может быть найден доступный метод расширения «AddMemoryCache», принимающий первый аргумент типа «IServiceCollection» (вы пропустили директиву использования или сборку Справка?)".

Кто-нибудь знает, как провести модульное тестирование этого метода? Желательно без изменения самого метода. Есть ли стандартный способ сделать это? Любая помощь приветствуется.


person Martijn    schedule 21.02.2020    source источник
comment
Вы уверены, что у вас есть необходимые ссылки для доступа к этому методу расширения? Вам не хватает директивы using или ссылки на сборку?   -  person Nkosi    schedule 21.02.2020


Ответы (1)


Я думаю, вам нужно изменить 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, приведет к введению зависимостей и усложнит тестирование изолированного кода.

person Philip Atz    schedule 21.02.2020
comment
Это сработало. Мне пришлось исправить функцию (пожалуйста, примите редактирование). Спасибо. - person Martijn; 21.02.2020