it-swarm.com.de

Warum sollten Sie Unit-Tests für Controller schreiben?

Für mich ist dies ein völlig irrelevanter Unit-Test und ich verstehe nicht, warum jemand Zeit damit verbracht hat, ihn zu schreiben, da es sehr wenig Wert gibt, davon zu profitieren. Ich würde sehr gut wissen, ob dieser Controller den gewünschten Typ zurückgibt, indem er die Methode in einem Browser ausführt. Glauben Sie wirklich, dass dafür ein Test erforderlich ist und warum?

public class ConstituencyControllerTests
{
    private ConstituencyController _constituencyController;
    private Mock<IConstituencyService> _IConstituencyServiceMock;

    public ConstituencyControllerTests() {
        _IConstituencyServiceMock = new Mock<IConstituencyService>();
    }

    [Test]
    public async Task I_Check_For_Return_Type_And_Result() {
        _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object );

        var result = await _constituencyController.Get();
        var content = ( (dynamic)result ).Content;

        Assert.IsEmpty( content );
        Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result );
        _IConstituencyServiceMock.Verify( x => x.ListOfConstituencies(), Times.Once() );
    }
}
23
frostings

Der entscheidende Punkt ist hier:

Ich würde sehr gut wissen, ob dieser Controller den gewünschten Typ zurückgibt, indem er die Methode in einem Browser ausführt

Beim Unit-Test geht es um Automatisierung des Nicht-Regressionstests einfacher Codeeinheiten, nicht darum, dass Sie selbst aussehen. Sie möchten nicht immer Unit-Tests in Ihrer Anwendung durchführen.

BEARBEITEN: Hinzufügen eines @ anotherdave-Kommentars:

Es geht um einfache Skalierung. Das Testen eines Controllers in einem Browser ist möglicherweise in Ordnung. Was ist mit 10, 20, 50 Controllern? Sie werden den Test einmal schreiben; Möglicherweise müssen Sie es aktualisieren, wenn Sie den Controller ändern. Aber wie oft stellen Sie bereit? Sicherlich eine manuelle Überprüfung jedes Mal, wenn viel mehr Aufwand als der Test anfällt.

Als Alternative zu @ Vladislavs Antwort kann das Testen von Einheiten absolut alles ein Overkill sein und wirklich unerwünscht. Wenn Sie etwas Leichteres benötigen, können Sie mit Selenium Tests auf höherer Ebene ohne Regression durchführen. Sicherlich erhalten Sie weniger Abdeckung als beim Testen von Einheiten, aber Sie können eine angemessene Abdeckung erhalten, die viel weniger Zeit für das Testen von Einheiten kostet und flexibler ist.

Das heißt, wenn Sie alles Unit-testen, müssen Sie jedes Mal, wenn Sie ein einfaches Element ändern, einen oder mehrere Tests aktualisieren.

29
Walfrat

Warum sollten Sie Unit-Tests für Controller schreiben?

Denn ohne den Kontext zu kennen, kann man nicht sicher sagen, ob man dies oder das testen muss. Hier sind einige Gründe, warum Sie Controller testen möchten:

  • die Steuerung kann eine komplexe Service-Verdrahtungslogik enthalten, die fehleranfällig ist. Die Dienste selbst funktionieren möglicherweise einwandfrei. Dies ist das Ergebnis, das Sie testen möchten. Aus irgendeinem Grund haben Sie erwogen, die Orchestrierungsschicht nicht in Ihre App einzuführen
  • ihre Controller enthalten DIE GANZE Geschäftslogik der Anwendung und Controller sind eigentlich alles, was Sie testen können (bitte tun Sie nicht so, als hätten Sie Ihr ganzes Leben lang mit idealen Codebasen gearbeitet, es gibt solche Codebasen, glauben Sie mir).
  • ihr Team besteht zu 99% aus Genies und zu 1% aus Durchschnittsbürgern, und Sie möchten 1% der Fehler in ihrem Gehalt vermeiden
24

Ich stimme dem OP voll und ganz zu.

Ein Unit-Test für eine Steuerung ist sinnlos. Sie testen Ihre Controller implizit über Regressionstests (z. B. mit Selen).

Sie sollten alle vom Controller verwendeten Komponenten/Objekte mit TDD versehen und die Controller so dünn wie möglich halten. Dann wird alles richtig getestet. Sie möchten sicher sein, dass bei der Ausführung von Webanfragen alles gut zusammenarbeitet. Das sind Regressionstests.

1
winkbrace