Ich habe eine Schnittstelle, die deklariert
Task DoSomethingAsync();
Ich verwende MoqFramework für meine Tests:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
Dann führe ich in meinem Test den Code aus, der aufgerufen wird await DoSomethingAsync()
. Und der Test schlägt in dieser Zeile einfach fehl. Was mache ich falsch?
c#
unit-testing
task-parallel-library
moq
Waldemar
quelle
quelle
Antworten:
Ihre Methode hat keine Rückrufe, daher gibt es keinen Grund zur Verwendung
.CallBack()
. Sie können einfach eine Aufgabe mit den gewünschten Werten mit.Returns()
und Task.FromResult zurückgeben , z.Update 22.06.2014
Moq 4.2 verfügt über zwei neue Erweiterungsmethoden, die dies unterstützen.
Update 2016-05-05
Wie Seth Flowers in der anderen Antwort erwähnt ,
ReturnsAsync
ist es nur für Methoden verfügbar, die a zurückgebenTask<T>
. Für Methoden, die nur eine Aufgabe zurückgeben,kann verwendet werden.
Wie in dieser Antwort gezeigt, wird dies in .NET 4.6 vereinfacht
.Returns(Task.CompletedTask);
, z.quelle
.Returns(Task.FromResult(default(object))
funktioniert gut, wenn der Rückgabetyp ungültig ist..Returns(Task.FromResult(null as MyType))
funktioniert gut, wenn der erwartete Rückgabetyp null ist.default(object)
nicht mehr benötigt.null as MyType
ist dasselbe,default(MyType)
solangeMyType
es sich um einen Referenztyp handelt.Ähnliches Problem
Ich habe eine Oberfläche, die ungefähr so aussah:
Symptome
Mein Komponententest ist fehlgeschlagen, als mein Dienst
awaited
den Anruf an testeteDoSomething
.Fix
Im Gegensatz zur akzeptierten Antwort können Sie
.ReturnsAsync()
IhreSetup()
dieser Methode in diesem Szenario nicht aufrufen , da die Methode nicht generischeTask
, sondern die nicht generische Methode zurückgibtTask<T>
.Sie können
.Returns(Task.FromResult(default(object)))
das Setup jedoch weiterhin verwenden, sodass der Test bestanden werden kann.quelle
Sie müssen nur
.Returns(Task.FromResult(0));
nach dem Rückruf hinzufügen .Beispiel:
quelle
Jetzt können Sie auch das Talentsoft.Moq.SetupAsync-Paket https://github.com/TalentSoft/Moq.SetupAsync verwenden
Was auf der Grundlage der hier gefundenen Antworten und der Ideen, die Moq vorgeschlagen, aber hier noch nicht umgesetzt wurden: https://github.com/moq/moq4/issues/384 , die Einrichtung asynchroner Methoden erheblich vereinfacht
Einige Beispiele aus früheren Antworten mit der SetupAsync-Erweiterung:
quelle