Проблема при приведении Generic.List к System.Threading.Task.Generic.List - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь создать макет метода IMemoryCache.TryGetValue, но он возвращает следующую ошибку при достижении cache.Get(cacheKey):

Невозможно привести объект типа 'System.Collections.Generic.List 1[ConnectionsModel]' to type 'System.Threading.Tasks.Task 1 [System.Collections.Generic.List`1 [ConnectionsModel]

Вот макет:

 private static Mock<IMemoryCache> ConfigureMockCacheWithDataInCache(List<ConnectionsModel> auth0ConnectionsResponse)
 {
        object value = auth0ConnectionsResponse;
        var mockCache = new Mock<IMemoryCache>();
        mockCache
            .Setup(x => x.TryGetValue(
                It.IsAny<object>(), out value
            ))
            .Returns(true);
        return mockCache;
    }

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

var connectionList = new List<ConnectionsModel>();
var connectionsModel= new ConnectionsModel()
{
     id = "1",
    name = "abc",
    enabled_cons = new List<string>() { "test" }
};
connectionList.Add(connectionsModel);
var mockObject = ConfigureMockCacheWithDataInCache(connectionList);
var sut = new MyService(mockCache.Object);
// Act
var result = await sut.GetConnection(_clientId);

и вот служба, с которой он работает:

public async Task<ConnectionsModel> GetConnection(string clientId)
{
    var connections = await _cacheService.GetOrSet("cacheKey", ()=> CallBack());
    var connection = connections.FirstOrDefault();
    return connection;
}
private async Task<List<ConnectionsModel>> CallBack()
{
    string url = url;
    _httpClient.BaseAddress = new Uri(BaseUrl);
    var response = await _httpClient.GetAsync(url);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsAsync<List<ConnectionsModel>>();
}

и метод расширения кеша:

   public static T GetOrSet<T>(this IMemoryCache cache, string cacheKey, Func<T> getItemCallback, double cacheTimeout = 86000) where T : class
    {
        T item = cache.Get<T>(cacheKey);
        if (item == null)
        {
            item = getItemCallback();
            cache.Set(cacheKey, item, DateTime.Now.AddSeconds(cacheTimeout));
        }
        return item;
    }

После этой строки T item = cache.Get<T>(cacheKey); Я получаю вышеупомянутое исключение. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Рассмотрите возможность создания дополнительной перегрузки расширения, чтобы можно было использовать асинхронный API

public static async Task<T> GetOrSet<T>(this IMemoryCache cache, string cacheKey, Func<Task<T>> getItemCallback, double cacheTimeout = 86000) where T : class
{
    T item = cache.Get<T>(cacheKey);
    if (item == null)
    {
        item = await getItemCallback();
        cache.Set(cacheKey, item, DateTime.Now.AddSeconds(cacheTimeout));
    }
    return item;
}
0 голосов
/ 01 ноября 2018

В вашем методе расширения вы вызываете getItemCallback(), не ожидая его. Эта лямбда вызывает ваш Callback метод в вашем сервисе, который является асинхронным, так что это тоже асинхронный метод. В результате вы устанавливаете item на Task<List<ConnectionsModel>> и пытаетесь вернуть его как List<ConnectionsModel>.

item = await getItemCallback();
...