Mam interfejs, który deklaruje
Task DoSomethingAsync();
Używam MoqFramework do moich testów:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
Następnie w teście wykonuję kod, który się wywołuje await DoSomethingAsync()
. A test po prostu kończy się niepowodzeniem na tej linii. Co ja robię źle?
c#
unit-testing
task-parallel-library
moq
Waldemar
źródło
źródło
Odpowiedzi:
Twoja metoda nie ma żadnych wywołań zwrotnych, więc nie ma powodu, aby jej używać
.CallBack()
. Możesz po prostu zwrócić zadanie z żądanymi wartościami za pomocą.Returns()
i Task.FromResult , np .:Aktualizacja 22.06.2014
Moq 4.2 ma dwie nowe metody rozszerzenia, aby w tym pomóc.
Aktualizacja 2016-05-05
Jak wspomina Seth Flowers w drugiej odpowiedzi ,
ReturnsAsync
jest dostępna tylko dla metod, które zwracają aTask<T>
. W przypadku metod, które zwracają tylko Zadanie,może być użyty.
Jak pokazano w tej odpowiedzi , w .NET 4.6 jest to uproszczone
.Returns(Task.CompletedTask);
, np .:źródło
.Returns(Task.FromResult(default(object))
działa dobrze, gdy typ zwrotu jest nieważny..Returns(Task.FromResult(null as MyType))
działa dobrze, gdy oczekiwany typ zwrotu jest pusty.default(object)
nie jest już potrzebny.null as MyType
jest taki sam, jakdefault(MyType)
długoMyType
jest typem odniesienia.Podobny problem
Mam interfejs, który wyglądał mniej więcej tak:
Objawy
Mój test jednostkowy nie powiódł się, gdy testowana usługa
awaited
dzwoniła doDoSomething
.Naprawić
W przeciwieństwie do akceptowanego odpowiedź, nie jesteś w stanie zadzwonić
.ReturnsAsync()
na TwoimSetup()
tej metody w tym scenariuszu, ponieważ metoda zwraca nierodzajowąTask
zamiastTask<T>
.Nadal możesz jednak korzystać
.Returns(Task.FromResult(default(object)))
z konfiguracji, co pozwala na zaliczenie testu.źródło
Musisz dodać tylko
.Returns(Task.FromResult(0));
po oddzwonieniu.Przykład:
źródło
Teraz możesz także korzystać z pakietu Talentsoft.Moq.SetupAsync https://github.com/TalentSoft/Moq.SetupAsync
Które na podstawie odpowiedzi tutaj znalezionych i pomysłów zaproponowanych Moq, ale wciąż jeszcze nie zaimplementowanych tutaj: https://github.com/moq/moq4/issues/384 , znacznie upraszczają konfigurację metod asynchronicznych
Kilka przykładów znalezionych w poprzednich odpowiedziach wykonanych przy użyciu rozszerzenia SetupAsync:
źródło