Исключение выброса модульного теста с политикой повтора - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь написать модульный тест для проверки политики 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");
            });

Что я пытаюсь сделать:

  1. Бросить SqlException в ExecuteAsyn c 2 раза
  2. 3-й раз возвращает истину

Что на самом деле происходит:

  1. Выдает SqlException в ExecuteAsyn c 1 раз
  2. Сбой модульного теста
  3. ExecuteAsyn c не перезапускается еще 2 раза
...