Я высмеиваю некоторую реализацию с использованием Moq, и я хочу убедиться, что метод вызывается правильно на этом интерфейсе, проблема в том, что он выглядит примерно так:
public interface IToBeMocked {
void DoThing(IParameter parameter);
}
public interface IParameter {
Task<string> Content { get; }
}
Итак, я настроил свой макет:
var parameter = "ABC";
var mock = new Mock<IToBeMocked>();
mock
.Setup(m => m.DoThing(It.IsAny<IParameter>()))
.Callback<IParameter>(p async => (await p.Content).Should().Be(parameter));
new Processor(mock.Object).Process(parameter);
mock
.Verify(m => m.DoThing(It.IsAny<IParameter>()), Times.Once);
К сожалению, этот тест уже проходит со следующей реализацией:
public class Processor {
public Processor(IToBeMocked toBeMocked){
_toBeMocked = toBeMocked;
}
public void Process(string parameter){
_toBeMocked.DoThing(null);
}
}
Поскольку обратный вызов является асинхронным, но подпись требует действия, то есть ожидающего никогда не ожидается, и тестзаканчивается до выдачи исключения.
Есть ли в Moq какие-либо функции для ожидания асинхронного обратного вызова?
Редактировать
Кажется, есть некоторая путаница.Я надеюсь, что это проясняет проблему.
Я делаю TDD.Я реализовал простейшую оболочку кода для компиляции теста.Затем я написал тест, чтобы убедиться, что «ABC» является результатом Task
, и настроил его запуск.Это проходит. Это проблема .Я хочу, чтобы тест не прошел, поэтому я могу реализовать «реальную» реализацию.
Редактировать 2
Чем больше я думаю об этом, тем больше я думаю, что это, вероятно, невозможно.Я открыл вопрос для репо: https://github.com/moq/moq4/issues/737, но я думал о реализации такой функции, как я писал запрос в ожидании подачи PR, и это кажется невозможным.Тем не менее, если у кого-то есть какие-либо идеи, я бы хотел услышать их здесь или в выпуске GitHub, и я буду держать оба места в курсе.На данный момент, я полагаю, мне придется использовать заглушку.