Как смоделировать метод GetOrAddAsyn c в IAppCache с помощью функции It.IsAny AddItemFactory - PullRequest
0 голосов
/ 23 марта 2020

В методе, который я тестирую, есть этот бит кода:

var devices = await _cache.GetOrAddAsync(_cacheKey, AddItemFactory, DateTimeOffset.Now.AddMinutes(Configuration.DeviceInMinutes));`

Где _cache - это IAppCache и в тесте

имитируется new Mock<IAppCache>();

AddItemFactory имеет следующую подпись:

private async Task<IDictionary<int, Device>> AddItemFactory()

В моем тесте я написал:

        _appCache.Setup(x => x.GetOrAddAsync(
            It.IsAny<string>(),
            It.IsAny<Func<Task<IDictionary<int, Device>>>>(),
            It.IsAny<DateTimeOffset>())
        ).ReturnsAsync(fakeDictionary);

Когда этот .Setup будет оценен, мой тест завершится со следующей ошибкой:

System.NotSupportedException : Invalid setup on an extension method: x => x.GetOrAddAsync<IDictionary<int, Device>>(It.IsAny<string>(), It.IsAny<Func<Task<IDictionary<int, Device>>>>(), It.IsAny<DateTimeOffset>())

Я думаю, что это издевается правильно, потому что IntelliSense Visual Studio не жалуется и подписи неправильно, но я не понимаю, что происходит.

1 Ответ

1 голос
/ 24 марта 2020

что перегрузка метода GetOrAddAsyn c является методом расширения; методы расширения не могут быть смоделированы.

GetOrAddAsync<T>(
      this IAppCache cache,
      string key,
      Func<Task<T>> addItemFactory,
      DateTimeOffset expires)

Вам необходимо смоделировать следующий метод на интерфейсе IAppCache:

Task<T> GetOrAddAsync<T>(string key, Func<ICacheEntry, Task<T>> addItemFactory);

Если вы хотите использовать Moq для этого, библиотека LazyCache.Testing.Moq (отказ от ответственности - я автор) реализует это с помощью следующей настройки:

cachingServiceMock.Setup(m => m.GetOrAddAsync(
    It.IsAny<string>(),
    It.IsAny<Func<ICacheEntry, Task<T>>>()))    
    .Returns(Task.FromResult(cacheEntryValue));

, где cacheEntryValue - это значение результата задачи, которое должен возвращать вызов.

Если вам не нужно использовать Moq, учитывая, что вы используете метод GetOrAdd *, вы должны иметь возможность использовать встроенный фальшивый (MockCachingService), предоставляемый библиотекой LazyCache, согласно DOCO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...