Вставка строки кода в метод только при модульном тестировании - PullRequest
0 голосов
/ 05 марта 2020

Здравствуйте, я тестирую метод, который выполняет некоторые операции I/O. Мне было интересно, есть ли какой-нибудь способ приостановить этот метод на определенное время c, в указанной строке c , без изменения исходного кода.

Оригинальный метод

public async Task<int> SomeMethodAsync()
{
    var x=DoSomething1();
    int value=await DoSomething2Async(); 
    return value;
}

Посмотрите на метод выше. Есть ли способ от TestCase добавить задержка или пауза в указанном c месте в целевом методе? Я бы хотел, чтобы мой метод стал примерно таким Только при модульном тестировании !:

Желаемый метод при модульном тестировании

  public async Task<int> SomeMethodAsync()
    {
         var x=DoSomething1();   //line index=0
    #    await Task.Delay(delay) //delay set in the testcase
         int x=await DoSomething2Async();  //line index=1
         return x;  
    }

Unit Test

[TestCase]
public void TestSomeMethodWithDelay()
{
    var delay=1000;
    int desiredLineIndex=1;
    int result=await SomeMethodAsync();
}

Как вы можете видеть, я хотел бы при тестировании метода вставить некоторый код перед целевой строкой, в моем случае await Task.Delay(interval), где interval установлено в TestCase. Я не хочу изменять / загрязнять исходный код директивами препроцессора для тестирования. Единственный другой способ, которым я мог бы подумать, - это использовать что-то вроде System.Reflection.Emit и переписать целевой метод при тестировании.

Есть ли какие-то другие элегантный способ?

PS Я просто хочу при запуске определенного набора тестов вставить задержку между двумя lines of code без изменения исходного кода.

Обновление SomeMethodAsync от другого dll. Код не должен быть изменен! DoSomething2Async - это внешний вызов.

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