typescript + jest


singletonクラスのmock化

テスト対象が依存しているsingletonクラスの雛形

singleton.ts
export class singleton {
    private static instance_:instance_
    public static instance():singleton {
        if (!this.instance_) {
          this.instance_ = new singleton()
        }
        return this.instance_
    }

    private constructor(){}

    public func1() {}
    public func2() {}
}

テストターゲットクラス

hoge.ts

import {singleton} from "./singleton"
export class hoge {
    public hoge() {
        singleton.instance().func1()
    }
    public piyo() {
        singleton.instance().func2()
    }
}

hoge.tsのテストコード

hoge.test.ts
import {singleton} from "./singleton"
const mock_instance = jest.fn()
const mock_func1 = jest.fn()
const mock_func2 = jest.fn()
jest.mock("./singleton")
mock_instance.mockImplementation(()=>{
    return {
        func1: mock_func1 ,
        func2: mock_func1 
    }
})
singleton.Instance = mock_instance

自動生成されたモックをベースに手動でモックを作っています。
これでhoge.tsが参照するsingletonクラスはモック化されているので、
テストを行うことができます。

注意点は以下です

  • mock_instance変数名はmockから始める必要があります。
  • singletonクラスのinstance関数にget修飾子を使用することはできません。