У меня есть интерфейс, который объявляет
Task DoSomethingAsync();
Я использую MoqFramework для своих тестов:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
Затем в моем тесте я выполняю код, который вызывает await DoSomethingAsync()
. И тест просто не проходит на этой линии. Что я делаю не так?
c#
unit-testing
task-parallel-library
moq
Waldemar
источник
источник
Ответы:
Ваш метод не имеет обратных вызовов, поэтому нет причин для его использования
.CallBack()
. Вы можете просто вернуть Task с нужными значениями, используя.Returns()
и Task.FromResult , например:Обновление 2014-06-22
Moq 4.2 имеет два новых метода расширения, чтобы помочь с этим.
Обновление 2016-05-05
Как упоминает Сет Флауэрс в другом ответе ,
ReturnsAsync
доступно только для методов, которые возвращают aTask<T>
. Для методов, которые возвращают только Задачу,может быть использован.
Как показано в этом ответе , в .NET 4.6 это упрощается
.Returns(Task.CompletedTask);
, например:источник
.Returns(Task.FromResult(default(object))
хорошо работает, когда возвращаемый тип void..Returns(Task.FromResult(null as MyType))
хорошо работает, когда ожидаемый тип возвращаемого значения равен нулю.default(object)
больше не нужен.null as MyType
такой же , как доdefault(MyType)
тех пор , какMyType
это ссылочный тип.Аналогичная проблема
У меня есть интерфейс, который выглядел примерно так:
симптомы
Мой модульный тест не прошел, когда мой сервис тестировал
awaited
вызовDoSomething
.Fix
В отличие от принятого ответа, вы не можете позвонить
.ReturnsAsync()
на свой контекстуальныйSetup()
этого метода в этом случае, так как метод возвращает необщегоTask
, а неTask<T>
.Тем не менее, вы все еще можете использовать
.Returns(Task.FromResult(default(object)))
в настройках, что позволяет пройти тест.источник
Вам нужно только добавить
.Returns(Task.FromResult(0));
после обратного вызова.Пример:
источник
Теперь вы также можете использовать пакет Talentsoft.Moq.SetupAsync https://github.com/TalentSoft/Moq.SetupAsync.
Которые на основе ответов, найденных здесь, и идей, предложенных Moq, но еще не реализованных здесь: https://github.com/moq/moq4/issues/384 , значительно упрощают настройку асинхронных методов.
Несколько примеров из предыдущих ответов, выполненных с расширением SetupAsync:
источник