🔟
[読書メモ]オブジェクト設計スタイルガイド 7章7~8節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
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