Warum würden Sie Komponententests für Steuerungen schreiben?

22

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 wohl wissen, ob dieser Controller den gewünschten Typ zurückgibt, indem er die Methode in einem Browser ausführt. Glauben Sie wirklich, dass hierfü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() );
    }
}
Zuckerguss
quelle
7
Stimmen Sie dem @gnat nicht zu. Hierbei handelt es sich nicht unbedingt um Sprachkonstrukte, sondern um die Art des von einem Controller zurückgegebenen Ergebnisses. Wenn Sie keine Vererbungshierarchie haben, läuft es möglicherweise auf dasselbe hinaus, aber es wird zu einer völlig anderen Bestie, wenn der Controller erwartet, dass Ancestors zurückgegeben werden, der Controller Person zurückgibt und Person nun so geändert wird, dass sie nicht von Ancestor, sondern von PeopleAncestor abstammt ... antwortet auch, warum das Testen einer solchen Methode eine gute Idee sein kann ...;) Unit-Tests sollen Situationen aufgreifen, in denen eine Änderung in einer Sache etwas anderes zerstören würde.
Marjan Venema
Normalerweise verbringe ich nicht viel Zeit damit, die Einstiegspunkte der Anwendung zu testen. Es ist wie beim Unit-Testen einer Hauptmethode einer Konsolenanwendung. macht für mich nur sehr wenig Sinn.
Mvision

Antworten:

29

Der entscheidende Punkt ist hier:

Ich würde sehr wohl 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 die Automatisierung von Nicht-Regressionstests für einfache Code-Einheiten, nicht darum , wie Sie selbst aussehen. Sie möchten sich nicht immer selbst darum bemühen, Ihre Anwendung zu testen.

BEARBEITEN: @anotherdave Kommentar hinzufügen:

Es geht um einfache Skalierung. Das Testen eines Controllers in einem Browser ist möglicherweise in Ordnung. Was ist mit 10, 20, 50 Controllern? Du wirst den Test einmal schreiben; Möglicherweise müssen Sie es aktualisieren, wenn Sie den Controller ändern, was Overhead ist. Aber wie oft setzen Sie ein? Sicherlich eine manuelle Prüfung jedes Mal, wenn es viel mehr Aufwand gibt, als der Test

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 mithilfe von Selen einen Nicht-Regressionstest auf höherer Ebene durchführen. Sicherlich erhalten Sie weniger Deckung als Unit-Tests, aber Sie können eine raisonable Deckung erhalten, die viel weniger Zeit für Unit-Tests kostet und flexibler ist.

Wenn Sie also alle Komponenten testen, müssen Sie bei jeder Änderung eines einfachen Elements einen oder mehrere Tests aktualisieren.

Walfrat
quelle
4
I would know perfectly well if this controller returned the wanted type by executing the method in a browser.Um noch etwas hinzuzufügen: - Es geht um eine einfache Skalierung. Das Testen eines Controllers in einem Browser ist möglicherweise in Ordnung. Was ist mit 10, 20, 50 Controllern? Du wirst den Test einmal schreiben; Möglicherweise müssen Sie es aktualisieren, wenn Sie den Controller ändern, was Overhead ist. Aber wie oft haben Sie einsetzen ? Sicherlich eine manuelle Prüfung jedes Mal, wenn es viel mehr Aufwand als den Test gibt.
Anotherdave
"Beim Unit-Test geht es um Automatisierung" - Richtig ist jedoch auch der Integrationstest (Selen / Webdriver / etc.) Ich denke nicht, dass es notwendigerweise so kurz und trocken ist, dass Unit-Tests schneller implementiert werden können als Integrationstests. Vieles hängt von der Vorgehensweise ab. Wenn für einen effektiven Komponententest jedoch ein Dutzend verschiedener Dienste und Aufrufe in jedem Dienst verspottet werden müssen, ist ein Integrationstest möglicherweise schneller zu implementieren und einfacher zu warten (obwohl die Ausführung im Allgemeinen viel langsamer ist, ja). . Entscheidend ist, dass vieles vom Kontext und der Komplexität des getesteten Codes abhängt.
Donnerstag,
@ anotherdave Kommentar hinzugefügt
Walfrat
@aroth Mein Punkt war das Gegenteil, ein vollständiger Komponententest ist etwas, das viel Zeit in Anspruch nimmt und es sehr schwierig macht, den Code zu ändern, ohne einen Komponententest durchführen zu müssen. Integrationstest ist leichter. Natürlich möchten Sie einen sehr komplexen Unit-Test, aber nicht, weil Sie diesen Teil getestet haben, müssen Sie alles Unit-Testen. Wieder sehen wir Menschen, die nach der Silberkugel suchen, wo er nicht existiert.
Walfrat
24

Warum würden Sie Komponententests für Steuerungen schreiben?

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

  • Der Controller enthält möglicherweise eine komplexe Dienstverdrahtungslogik, die fehleranfällig ist. Die Dienste selbst funktionieren möglicherweise einwandfrei. Dies ist das Ergebnis, das Sie testen möchten, und aus irgendeinem Grund haben Sie in Erwägung gezogen, keine Orchestrierungsschicht in Ihre App einzuführen
  • Ihre Controller enthalten DIE GANZE Geschäftslogik der Anwendung und Controller sind eigentlich alles, was Sie testen können.
  • Ihr Team besteht zu 99% aus Genies und zu 1% aus Durchschnittsleuten, und Sie möchten, dass diese 1% nicht zu Fehlern in ihrem Gehalt werden
Vladislav Rastrusny
quelle
2
Ich würde hinzufügen: "Sie können nicht vorhersehen, wer das Projekt in Zukunft loswerden wird, und Tests sind Teil des
selbstdokumentierten
4
In der Mitte kann ein Projekt, das ohne Berücksichtigung von Tests erstellt wurde, möglicherweise nur auf eine andere Art und Weise als ein Controllertest ohne Verspottungen getestet werden. Ich arbeite mit einem C # -Team zusammen, das genau ein solches Projekt betreut. Daher schreiben sie Controllertests, bis sie die erforderliche Struktur (Schnittstellen usw.) hinzufügen können, um feinere Tests durchführen zu können.
Wayne Conrad
1

Ich stimme dem OP voll und ganz zu.

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

Sie sollten alle Komponenten / Objekte, die der Controller verwendet, einem TDD unterziehen und die Controller so dünn wie möglich halten. Dann wird alles richtig gerätetestet. Sie möchten sicher sein, dass bei der Ausführung von Webanfragen alles gut zusammenarbeitet. Das sind Regressionstests.

winkbrace
quelle
Vielleicht, aber das ist keine Antwort auf die Frage. In der Tat ist es ein Argument gegen die Verwendung von Unit-Tests hier.
23.
Ich glaube, ich habe die Frage "Glauben Sie, dass hierfür ein Test erforderlich ist und warum?" Beantwortet.
Winkbrace
Ja, ich denke @winkbrace und ich teile die gleichen Gedanken dazu. Aber ich glaube auch, dass es eine Diskussion darüber gibt, was Sie testen sollten und nicht. Ich denke die Leute testen zu viel und die "falschen" Dinge. In meinem Beispiel ist das Testen des Controllers sehr wenig sinnvoll, da er so dünn ist und hoffentlich Tests rund um die Dienste enthält. Alle Antworten hier sind aussagekräftig und haben gute Punkte, aber es ist nicht wirklich möglich, eine als richtige Antwort zu markieren.
Zuckerguss
Die Steuerungslogik kann mithilfe automatisierter Integrationstests getestet werden, die sich von Unit-Tests für einzelne Komponenten unterscheiden.
KevBurnsJr
-1: Ein Unit - Test für eine Steuerung könnte sinnlos. Bei Controllern geht es um Transformation, aber manchmal ist die Transformation selbst komplex und ein Entwickler möchte sie möglicherweise behandeln. Ich denke auch, dass Unit-Tests 1) letztendlich dazu dienen, eine Implementierung zu validieren, nicht unbedingt das Verhalten auf hoher Ebene zu validieren, und 2) verdammt schnell sein sollen . Beide Eigenschaften machen Unit-Tests während der Implementierungszeit viel nützlicher. Mit anderen Worten, sie sind letztendlich ein Werkzeug für Entwickler und nur nebenbei ein Weg, um die Produktqualität zu validieren.
Rsenna