私は読んClean Code: A Handbook of Agile Software Craftsmanship
でいて、例の1つにPortfolio
クラスとクラスが含まれていTokyoStockExchange
ます。ただし、ポートフォリオの値を決定するために外部 API としてPortfolio
依存しているため、非常にテスト可能ではありません。これは非常に揮発性のルックアップであり、テストを助長しません。TokyoStockExchange
したがって、彼らは共通のStockExchange
インターフェースを作成することでこれを解決し、基本クラスTokyoStockExchange
を実装しています。DummyStockExchange
したがって、依存関係逆転の原則が達成され、PortfolioTest
クラスで をインスタンス化しDummyStockExchange
、株価を企業に固定し、DummyStockExchange
インスタンスをポートフォリオに割り当て、その企業の株式をポートフォリオに追加し、期待値がまさに適正値。コードは次のとおりです。
public class PortfolioTest
{
private DummyStockExchange exchange;
private Portfolio portfolio;
protected void setUp()
{
exchange = new DummyStockExchange();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}
public void GivenFiveMSFTTotalShouldBe500()
{
portfolio.add(5, "MSFT");
Assert.assertEquals(500, portfolio.value());
}
}
私の質問は、単純に、なぜですか?
TokyoStockExchange
クラスがクラスと連携して機能するかどうかをテストしようとしていましたPortfolio
。明らかに、株価を設定する新しいメソッドを使用して別のクラスを作成し、ポートフォリオにそれらの株式を 5 つ与えると、すべてが機能します。それはただ..テストするのは役に立たないようです。TokyoStockExchange
株価が変動するため、基本的にテストが不可能であることは理解してPortfolio
いますが、役に立たないテストでのサブビングが状況にどのように役立つかはわかりません。
加算器プログラムが機能するかどうかわからないのと同じように見えますが、利用可能な唯一の数値はランダムに生成されるため、2 を与えるダミー クラスを作成し、if をテストします2 + 2 = 4
。ええ、明らかにそれは本当です。TokyoStockExchange
別のクラスをテストしているため、中断することはできますが、テストは成功します。いずれにせよ、これはすべて欺瞞のように思えます。また、機能することがわかっているものをテストするためだけに追加のコードを書かなければならないという結果にもなります。
これが、現時点で単体テストを理解する上での最大の問題だと思います。私は自分が間違っていることを知っています。うまくいけば、誰かが私を助けてくれます。