Модульное тестирование C#: параллельные запросы с помощью MemoryCache и SemaphoreSlimC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Модульное тестирование C#: параллельные запросы с помощью MemoryCache и SemaphoreSlim

Сообщение Anonymous »

Я провожу модульное тестирование службы, которая извлекает данные из API и кэширует их с помощью IMemoryCache и SemaphoreSlim для обработки параллелизма. Я хочу смоделировать сценарий с несколькими одновременными запросами, где:
  • Первый запрос обходит кеш, извлекает данные из API и
    заполняет кеш.
  • Последующие запросы попадают в кеш и позволяют избежать
    избыточных вызовов API.
В моем тесте , я использую настоящий экземпляр MemoryCache вместо того, чтобы издеваться над ним. Хороший ли это подход или есть ли лучшие способы реализовать этот сценарий в моем модульном тесте? Буду очень признателен за любые предложения.
Вот мой модульный тест
public async Task GetSigningKeysFromJwkAsync_ConcurrentRequests_OnlyOneFetchAndOthersUseCache()
{
// Arrange
var httpClient = HttpClient();
var mockHttpClientFactory = new Mock();
mockHttpClientFactory.Setup(factory
=> factory.CreateClient("client")).Returns(httpClient);
var memoryCache = new MemoryCache(new MemoryCacheOptions()); // This is the question
var publicKeyService = new PublicKeyService(mockHttpClientFactory.Object, memoryCache);
var bffUrl = new Uri("https://dummy-link/jwks");

// Act
var tasks = new List();
for (int i = 0; i < 10; i++) // Simulate 10 concurrent requests
{
tasks.Add(publicKeyService.GetSigningKeysFromJwkAsync(bffUrl));
}
await Task.WhenAll(tasks);

// Assert

var firstResult = tasks[0].Result;
foreach (var task in tasks)
{
Assert.Equal(firstResult, task.Result);
}
}

Вот мой метод, который я пытаюсь протестировать
public async Task GetSigningKeysFromJwkAsync(Uri url)
{
if (_cache.TryGetValue(_cacheKey, out Dictionary? cachedKeys))
{
return cachedKeys;
}

await _semaphore.WaitAsync();

try
{
if (_cache.TryGetValue(_cacheKey, out cachedKeys))
{
return cachedKeys;
}

HttpResponseMessage response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
var jwksJson = await response.Content.ReadAsStringAsync();

var issuerKeys = JsonSerializer.Deserialize(jwksJson);

var issuerSecurityKeySet = new Dictionary();
if (issuerKeys != null && issuerKeys.Any())
{
foreach (var ik in issuerKeys)
{
var jwks = new JsonWebKeySet(ik.Value);
issuerSecurityKeySet.Add(ik.Key, jwks.GetSigningKeys());
}
}

var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromHours(1));
_cache.Set(_cacheKey, issuerSecurityKeySet, cacheEntryOptions);

return issuerSecurityKeySet;
}
finally
{
_semaphore.Release();
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... aphoreslim
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»