NSubstitute - Erhielt für async - "Anruf nicht erwartet"Warnung
Ich versuche, stellen Sie sicher, dass eine asynchrone Methode aufgerufen wurde und mit den richtigen Parametern. Allerdings bekomme ich die Warnung:
"Weil dieser Anruf nicht erwartete, Ausführung der aktuellen Methode weiter, bevor der Anruf abgeschlossen ist. In Betracht ziehen anwenden der 'erwarten' - operator auf das Ergebnis der Ausschreibung". Diese Warnung wird angezeigt, auf der Linie der code, der unter der //Assert
Kommentar (unten).
Mein test mit NSubstitute ist wie folgt:
[Test]
public async Task SimpleTests()
{
//Arrange
var request = CreateUpdateItemRequest();
databaseHelperSub.ExecuteProcAsync(Arg.Any<DatabaseParams>()).Returns(Task.FromResult((object)null));
//Act
await underTest.ExecuteAsync(request);
//Assert
databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2"));
}
Die Einheit unter test-Methode underTest.ExecuteAsync(request)
Anrufe ExecuteProcedureAsync
und führt die erwarten:
var ds = await DatabaseHelper.ExecuteProcAsync(dbParams);
Aufgrund der Tatsache, dass mit NSubstitute, die Empfangene() ist erforderlich, nachdem die Ausführung der unit under test. In der Erwägung, dass in RhinoMocks, können Sie erwarten für einen Anruf zu erfolgen, bevor die Einheit unter test ausgeführt wird. RhinoMocks, können wieder die Aufgabe.FromResult() in der Erwägung, dass NSubstitute nicht.
Den RhinoMocks entspricht, die funktioniert, ist dies:
[Test]
public async Task SimpleTest()
{
//Arrange
var request = new UpdateItemRequest();
databaseHelperMock.Expect(m => m.ExecuteProcAsync(Arg<DatabaseParams>.Matches(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2
))).Return(Task.FromResult<object>(null));
//Act
await underTest.ExecuteAsync(request);
}
Habe ich gesehen, dass es einen workaround, wo Sie hinzufügen können, eine Erweiterung Methode zu entfernen das Problem:
public static class TestHelper
{
public static void IgnoreAwait(this Task task)
{
}
}
Bedeutung meiner test-Linie für NSubstitute ausgeführt werden können, wie folgt, und die Warnung geht Weg:
databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2")).IgnoreAwait();
}
Allerdings bin ich davon ausgegangen, es muss eine bessere Lösung gibt für das?
- Dies ist eine compiler-Warnung, die sagen, dass Sie vergessen hat, ein
await
vor, dass eine asynchrone Methode. Warum gehst du nicht einfach gesagtawait
in der Zeile nach der//Assert
? - Wenn Sie erwarten, bevor Sie den Anruf. Der test schlägt fehl, als er erhält eine null-Verweis-Ausnahme.
- NSubstitute nicht eine bessere Art des Umgangs mit diesen zu präsentieren. Siehe Jake ' s Erklärung hier: stackoverflow.com/a/31021430/906 Könnte sich lohnen, ein NSub ändern, ich habe ein Problem hier: github.com/nsubstitute/NSubstitute/issues/190
- vielleicht ohne Zusammenhang, aber trotzdem fühle ich mich wie empfehlen
Moq
.. sieht aus wie Sie könnte tun Moq.Verify()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sobald Sie das update auf die version 1.9.0 oder höher, Sie werden in der Lage sein zu verwenden, die
await
ohne Empfang einerNullReferenceException
.Wenn die
Received()
Prädikat wird zu kompliziert oder einfach nicht in übereinstimmung mit NSubstitute können Sie immer erfassen die angegebenen Argumente verwenden Rückrufe überWhen().Do()
oder.AndDoes()
. Für Ihren Fall, die würde so etwasDen Jake Ginnivan Antwort erklärt, dass für die Empfangenen erwarten ist nicht erforderlich, jedoch compiler nicht versteht.
Können Sie sicher unterdrückt die Warnung