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 gesagt await 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()
InformationsquelleAutor JBond | 2015-07-09
Schreibe einen Kommentar