Erstens einige Definitionen:
Ein Komponententest testet Einheiten isoliert von anderen Einheiten, aber was dies bedeutet, wird von keiner maßgeblichen Quelle konkret definiert. Definieren wir es also etwas besser: Wenn E / A-Grenzen überschritten werden (ob es sich bei dieser E / A um Netzwerk-, Datenträger-, Bildschirm, oder UI-Eingabe), gibt es einen semi-objektiven Ort, an dem wir eine Linie zeichnen können. Wenn der Code von der E / A abhängt, überschreitet er eine Einheitengrenze und muss daher die für diese E / A verantwortliche Einheit verspotten.
Unter dieser Definition sehe ich keinen zwingenden Grund, Dinge wie reine Funktionen zu verspotten, was bedeutet, dass Unit-Tests sich für reine Funktionen oder Funktionen ohne Nebenwirkungen eignen.
Wenn Sie Einheiten mit Effekten testen möchten, sollten Sie sich über die Einheiten lustig machen, die für die Effekte verantwortlich sind. Vielleicht sollten Sie stattdessen einen Integrationstest in Betracht ziehen. Die kurze Antwort lautet also: "Wenn Sie sich lustig machen müssen, fragen Sie sich, ob Sie wirklich einen Integrationstest benötigen." Aber hier gibt es eine bessere, längere Antwort, und das Kaninchenloch geht viel tiefer. Mocks sind vielleicht mein Lieblingscode-Geruch, weil es so viel zu lernen gibt.
Code riecht
Dazu wenden wir uns an Wikipedia:
Bei der Computerprogrammierung ist ein Codegeruch ein beliebiges Merkmal im Quellcode eines Programms, das möglicherweise auf ein tieferes Problem hinweist.
Es geht später weiter ...
"Gerüche sind bestimmte Strukturen im Code, die auf einen Verstoß gegen grundlegende Designprinzipien hinweisen und sich negativ auf die Designqualität auswirken." Suryanarayana, Girish (November 2014). Refactoring für Software Design Smells. Morgan Kaufmann. p. 258.
Code-Gerüche sind normalerweise keine Fehler. Sie sind technisch nicht inkorrekt und beeinträchtigen die Funktion des Programms nicht. Stattdessen weisen sie auf Schwachstellen im Design hin, die die Entwicklung verlangsamen oder das Risiko von Fehlern oder Ausfällen in der Zukunft erhöhen können.
Mit anderen Worten, nicht alle Codegerüche sind schlecht. Stattdessen sind sie häufige Anzeichen dafür, dass etwas möglicherweise nicht in seiner optimalen Form ausgedrückt wird, und der Geruch kann eine Gelegenheit zur Verbesserung des fraglichen Codes anzeigen.
Im Falle des Verspottens zeigt der Geruch an, dass die Einheiten, die anscheinend Verspottungen fordern, von den zu verspottenden Einheiten abhängen . Dies könnte ein Hinweis darauf sein, dass wir das Problem nicht in atomar lösbare Teile zerlegt haben und dass dies auf einen Designfehler in der Software hindeuten könnte.
Die Essenz jeder Softwareentwicklung besteht darin, ein großes Problem in kleinere, unabhängige Teile zu zerlegen (Zerlegung) und die Lösungen zu einer Anwendung zusammenzufassen, die das große Problem löst (Komposition).
Eine Verspottung ist erforderlich, wenn die Einheiten, mit denen das große Problem in kleinere Teile zerlegt wird, voneinander abhängen. Anders ausgedrückt ist eine Verspottung erforderlich, wenn unsere angenommenen atomaren Kompositionseinheiten nicht wirklich atomar sind und unsere Zerlegungsstrategie es nicht geschafft hat, das größere Problem in kleinere, unabhängige Probleme zu zerlegen, die gelöst werden müssen.
Es ist nicht so, dass das Verspotten eines Codes von Natur aus falsch ist - manchmal ist es sehr nützlich. Was es zu einem Codegeruch macht, ist, dass es auf eine problematische Kopplungsquelle in Ihrer Anwendung hinweisen kann. Manchmal ist es viel produktiver, diese Kopplungsquelle zu entfernen, als einen Schein zu schreiben.
Es gibt viele Arten der Kopplung, und einige sind besser als andere. Wenn Sie verstehen, dass Mocks ein Codegeruch sind, können Sie frühzeitig im Lebenszyklus des Anwendungsdesigns die schlimmsten Arten identifizieren und vermeiden , bevor sich der Geruch zu etwas Schlimmerem entwickelt.