4️⃣

[読書メモ]オブジェクト設計スタイルガイド 6章6節 with TypeScript

2024/03/05に公開

オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
https://www.oreilly.co.jp/books/9784814400331/

6.6 クエリメソッドのテストダブルにはスタブを使う

テストダブルとは、テストを実行するために使われるオブジェクトのこと。

interface IExchangeRate {
  exchangeRateFor(from: string, to: string, rate: number): void;
}

class FakeExchangeRate implements IExchangeRate {
  exchangeRateFor(from: string, to: string, rate: number): number {
    this.rates[from.asString()][to.asString()] = rate;
  }
}

// test

const fake = new FakeExchangeRate();
fake.exchangeRateFor("USD", "JPY", 1.5);

const currencyConverter = new CurrencyConverter(fake);
currencyConverter.convert(100, "USD", "JPY"); // 150

これによって、テストは独立しているため、テストが失敗したときに、どこが原因かがわかりやすくなる。

スタブを使うケース
スタブとは、ハードコーディングされた値を返すだけのテストダブルのこと。

class FakeExchangeRate implements IExchangeRate {
  exchangeRateFor(from: string, to: string, rate: number): number {
    return 1.5;
  }
}

// test
const fake = new FakeExchangeRate();
fake.exchangeRateFor("USD", "JPY", 1.5);

const currencyConverter = new CurrencyConverter(fake);
currencyConverter.convert(100, "USD", "JPY"); // 150

この場合、exchangeRateForメソッドは、常に1.5を返すようになっている。
このように、スタブを使うことで、テストの独立性を高めることができる。

Discussion