すべてのメソッドがユニットテストの値を返す必要がありますか


12

最終的に(そしてうまくいけば)TDDのみを開始するための単純な単体テストを作成する方法を学んでいます。今のところ、問題の原因を調べるために、すでに記述されているコードのテストを記述しようとしています。これはその1つです。

私がこの単純なクラス(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;        
    }
}

そして私はそれをこのように使用します:

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()何も返す必要はありませんが、そのため、テストできません。単体テストを作成するとき、コードをリファクタリングする必要がありますか?

TDDを実行していた場合、それをテストするためだけに何かを返すメソッドを常に作成する必要がありますか?または、何か不足していますか?

PSあなたはここでコードを見て実行することができます


4
setPrivateの場合、getPrivateの値が機能しているかどうかを教えてくれませんか?
JeffO 2017

はい@JeffO、私は何もないことを今見るだけで、それが働いたかどうかを確認するために、関数の戻りを使用する必要がありません。
遠方

「setPrivate()は何も返す必要はありませんが、そのためテストできません。」目に見える影響はありますか?もしそうなら、あなたはそれをテストすることができます。そうでなければ、それをテストすることに関心はありません(そして、それを実装することに関心はありません)。
mgoeminne 2017年

@mgoeminneメソッドがvoidであり、データベース/ログに書き込むか、その唯一の効果として別のオブジェクトにメッセージを送信するとどうなりますか?
アンドレス

@AndresF。データベース/ログから読み取るか、他のオブジェクトをモックして、データが送信されたことを確認できます。「単体」テストではないかもしれませんが、それは実際には重要ではありません。
Jacob Raihle 2017年

回答:


21

ここでのあなたの誤解は、「テスト中の対象」は常にそれ自体がメソッドでなければならないということです。しかし、そうではありません。一部のメソッドは他のメソッドを使用せずにテストできますが、SUTの一般的なサイズはクラス、または1つのクラスのいくつかの相互作用するメソッドと関数です。したがって、オブジェクトの内部状態を変更するメソッドがある場合は、そのオブジェクトの動作に外部から見える変更が常に存在する必要があります(そうでない場合、メソッドを最初から用意しても意味がありません)。単体テストでは、この動作を正確に検証できます。

たとえば、NumberFormatter浮動小数点数を事前定義された方法でフォーマットする責任を持つクラスがあるとします。メソッドが含まれているとしましょうFormatToString(double d)。レッツ・さらに、それはメソッドを持っていると仮定しsetDecimalSeparator、ありませんgetDecimalSeparator。それでもsetDecimalSeparator、メソッドの呼び出しがFormatToString希望どおりに動作した後は、簡単にテストを作成できます。このようなテストは次のようになります

  var nf = new NumberFormatter();
  nf.setDecimalSeparator(".");
  AssertEqual("12.34",nf.FormatToString(12.34))
  nf.setDecimalSeparator(",");
  AssertEqual("12,34",nf.FormatToString(12.34))

したがって、これは、setDecimalSeparator戻り値のないメソッドの意味のあるテストです。


そうですね、私の非現実的な例では、「getPrivate()」関数を使用して、「_ thisIsPrivate」に変更があったかどうかを確認し、「getPrivate()」が機能すると仮定しますが、より現実的なケースでは、変更されているオブジェクトをテストする必要があります。分かりやすい説明ありがとうございます!
2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.