Ich lerne, einfache Unit-Tests zu erstellen, um irgendwann (und hoffentlich) nur noch TDD zu machen. Im Moment versuche ich, Tests für bereits geschriebenen Code zu schreiben, um festzustellen, was Probleme verursachen könnte. Dies ist einer von ihnen.
Angenommen, ich habe diese einfache Klasse (mit Typescript-> Javascript):
class PrivateStuff {
greeting: string;
private _thisIsPrivate;
constructor(isPrivate: boolean) {
this._thisIsPrivate = isPrivate;
}
setPrivate(option) {
this._thisIsPrivate = option;
console.log("_thisIsPrivate changed to : " + option);
}
getPrivate() {
console.log("_thisIsPrivate is : " + this._thisIsPrivate);
return this._thisIsPrivate;
}
}
Und ich benutze es so:
let privateStuff = new PrivateStuff(false);
let buttonSet = document.createElement('button');
buttonSet.textContent = "Set True";
buttonSet.onclick = function () {
privateStuff.setPrivate(true);
}
let buttonGet = document.createElement('button');
buttonGet.textContent = "Get";
buttonGet.onclick = function() {
console.log(privateStuff.getPrivate());
}
document.body.appendChild(buttonSet);
document.body.appendChild(buttonGet);
setPrivate()
muss nichts zurückgeben, kann es aber deshalb nicht testen. Sollte ich beim Erstellen eines Komponententests den Code umgestalten?
Wenn ich TDD mache, sollte ich immer Methoden erstellen, die etwas zurückgeben, nur um es testen zu können? Oder fehlt mir etwas?
PS Sie können den Code hier sehen und ausführen
unit-testing
tdd
distante
quelle
quelle
Antworten:
Ich denke, Ihr Missverständnis hier ist, dass ein "zu testendes Subjekt" immer eine Methode für sich sein muss. Dies ist jedoch nicht der Fall, obwohl einige Methoden ohne Verwendung anderer Methoden getestet werden können. Die typische Größe eines SUT ist eine Klasse oder einige interagierende Methoden und Funktionen einer Klasse. Wenn Sie also eine Methode haben, die den internen Status eines Objekts ändert, muss das Verhalten dieses Objekts immer von außen sichtbar geändert werden (andernfalls wäre es nicht sinnvoll, die Methode überhaupt zu haben). Und in einem Unit-Test können Sie genau dieses Verhalten validieren.
Angenommen, Sie haben eine Klasse, die dafür
NumberFormatter
verantwortlich ist, Gleitkommazahlen vordefiniert zu formatieren. Nehmen wir an, es enthält eine MethodeFormatToString(double d)
. Nehmen wir weiter an, es hat eine MethodesetDecimalSeparator
, aber neingetDecimalSeparator
. Trotzdem können Sie leicht einen Test schreiben, wenn sichsetDecimalSeparator
die Methode nach einem Aufruf der MethodeFormatToString
wie gewünscht verhält. Ein solcher Test könnte so aussehenDies ist also ein aussagekräftiger Test
setDecimalSeparator
einer Methode ohne Rückgabewert.quelle