ファイル直下でexportされている関数にjest.spyOnを使いたい

2021.04.09

こんにちは。サービスGの金谷です。

JestにはspyOnという便利なメソッドが用意されています。

Jestオブジェクト · Jest

これを使うとJestでのテスト時に指定したメソッドがコールされているかどうかを確認できたりします。

具体的な使い方のイメージは先輩が書かれているこちらの記事が参考になると思います。

jest.spyOn() で Vue.js コンポーネントからのサービス呼び出しをテストする

公式ドキュメントを見ると第一引数にObject、第二引数にメソッド名(文字列)を受け取ると書かれています。

jest.spyOn(object, methodName)

では、オブジェクトのメソッドではない、ファイル直下でexportされている関数にはどう使ったらいいの・・・?

と思ったので調べてみました。

以下のようなコードを想定します。

helloWorldService.ts

export function hello(): string {
  return "Hello";
}
export default function world(): string {
  return "World";
}

helloWorldService.spec.ts

import { hello } from "@/helloWorldService";
import world from "@/helloWorldService";

describe("helloWorldServiceのテスト", () => {
  // helloとかworldをspyOnしたい
});

結論

以下のように * asを使ってあげると上手くいきました。

default exportしている場合は関数名がdefaultになるので注意しましょう。

import * as helloWorldService from "@/helloWorldService";

describe("helloWorldServiceのテスト", () => {
  it("export", () => {
    const spyHello = jest.spyOn(helloWorldService, "hello");
    helloWorldService.hello();
    expect(spyHello).toHaveBeenCalled();
  });
  it("default export", () => {
    const spyWorld = jest.spyOn(helloWorldService, "default");
    helloWorldService.default();
    expect(spyWorld).toHaveBeenCalled();
  });
});

 

テストを書くのは楽しい!!

良い自動テストライフを・・・!