Я пытаюсь написать модульный тест для проверки политики WaitAndRetryAsyn c с использованием Polly Чтобы проверить политику, мне нужно смоделировать и выдать SqlException с определенными номерами sqlerror.
Я следовал их документации по политикам модульного тестирования, в частности [2b] Политики тестирования с модульными тестами, независимо от потребления кода
Модульный тест, я использовал вопрос Stackoverflow Как бросить SqlException, когда это необходимо для проверки и юнит-тестирования? для создания класса SqlExceptionMocker
//Arrange
var policy = new CustomPolicyClass();
var randomSqlException = 0;
var invocations = 0;
var generatedException = SqlExceptionMocker.MakeSqlException(randomSqlException);
//Act
var result = await policy.TimeoutExceptionPolicy()
.ExecuteAsync<bool>(async () => invocations++ <= 1 ? throw generatedException : true);
//Assert
Assert.True(result);
public async Task<IAsyncPolicy> TimeoutExceptionPolicy() =>
Policy
.Handle<SqlException>(ex => errorNumberArray.Contains(ex.Number))
.WaitAndRetryAsync(3,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
(ex, timeSpan) =>
{
Console.WriteLine($"Exception: {ex.Message}");
Console.WriteLine($"Retrying in {timeSpan.Seconds} seconds");
});
Что я пытаюсь сделать:
- Бросить SqlException в ExecuteAsyn c 2 раза
- 3-й раз возвращает истину
Что на самом деле происходит:
- Выдает SqlException в ExecuteAsyn c 1 раз
- Сбой модульного теста
- ExecuteAsyn c не перезапускается еще 2 раза