🔟

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

2024/03/10に公開

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

7.7 モックで検証するのはコマンドメソッドの呼び出しのみとする

クエリメソッドは、モックで検証しないことが多い。
理由は、クエリメソッドは、外部の状態を変更しないためです。
そのため、クエリメソッドの戻り値を検証することで、クエリメソッドが正しく動作しているかを検証できます。

コマンドメソッドは、外部の状態を変更するため、モックで検証することが多いです。
理由は、コマンドメソッドが正しく動作しているかを検証するためです。

// Path: a.ts
export class A {
  public b: B;
  public c: C;

  public doSomething() {
    this.b.doSomething();
    this.c.doSomething();
  }
}

// Path: b.ts
export class B {
  public doSomething() {
    console.log('B#doSomething');
  }
}

// Path: c.ts
export class C {
  public doSomething() {
    console.log('C#doSomething');
  }
}

// Path: a.test.ts
import { A } from './a';
import { B } from './b';
import { C } from './c';

describe('A', () => {
  it('doSomething', () => {
    const b = new B();
    const c = new C();
    const a = new A();
    a.b = b;
    a.c = c;

    const bMock = jest.spyOn(b, 'doSomething');
    const cMock = jest.spyOn(c, 'doSomething');

    a.doSomething();

    expect(bMock).toBeCalledTimes(1);
    expect(cMock).toBeCalledTimes(1);
  });
});

7.8 まとめ

コマンドメソッドは、タスクを実行するために使用される。
命令形式で記述されることが多い。

システム協会を超えるコマンドの抽象を定義しよう。
コマンド自身が、コマンドを呼び出すテストでは、モックやスパイを使用して、コマンドが呼び出されたことを検証する。

Discussion