Имитированная зависимость с асинхронным методом никогда не возвращает управление вызывающей сторонеC#

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

Сообщение Anonymous »

При использовании NSubstitute я столкнулся либо с ошибкой, либо с непониманием того, как работает NSubstitute или async/await.
Я пытаюсь протестировать асинхронный метод, который имеет такой цикл while:

Код: Выделить всё

public class ClassUnderTest {
private readonly IDependencyToBeMocked _dependency;

ClassUnderTest(IDependencyToBeMocked dependency) {
_dependency = dependency;
}

public async Task MethodToBeTested(CancellationToken token) {
while (!stoppingToken.IsCancellationRequested)
{
await _dependency.Wait();
}
}
}

public interface IDependencyToBeMocked {
Task Wait();
}
Я организовал свой тест следующим образом, используя xUnit и NSubstitute.

Код: Выделить всё

public class Tests
{
private readonly IDependencyToBeMocked _dependency;
private readonly ClassUnderTest _classUnderTest;

public Tests()
{
_dependency = Substitute.For();
_classUnderTest = new ClassUnderTest(_dependency);
}

[Fact]
public async Task Test()
{
// arrange
var source = new CancellationTokenSource();
_dependency.Wait().Returns(Task.CompletedTask);

// act
var task = _classUnderTest.MethodToBeTested(source.Token);
await source.CancelAsync();
await task;

// assert
// do some assertions
}
}
Проблема возникает при запуске теста. Он никогда не выходит за пределы строки var Task = _classUnderTest.MethodToBeTested(source.Token); и токен отмены никогда не отменяется.
Тестируемый метод никогда не возвращается обратно в вызывающий абонент, несмотря на то, что его не ждут. Я бы ожидал, что при первом нажатии он ожидает _dependent.Wait(), чтобы управление вернулось вызывающему объекту (т. е. методу Test()), но вместо этого он постоянно застревает в цикле while.
Похоже, что происходит какая-то странность: если я изменю это так, _dependent.Wait().Returns(Task.Delay(10)); тест будет выполняться так, как ожидалось; однако, если я использую _dependent.Wait().Returns(Task.Delay(1));, он остается в цикле. Я подозреваю, что это как-то связано с тем, что планировщик задач решает, будет ли await задерживать поток или нет перед возвратом к вызывающему объекту?
Не уверен, что я неправильно понимаю, как работают асинхронные методы. предназначены для насмешек или чего-то в этом роде.
Спасибо!

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

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

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

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

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

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

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