TypeScript と使う設定

依存のインストール

以下の3つをインストールします。

yarn add -D @types/jest jest ts-jest 

設定ファイルを作る

以下はsrc/以下のすべての.tsまたは.tsxファイルをテストの対象にするという意味になる設定です。その時の環境に合わせてtestRegexを書き換えることでいろんな環境に合わせれます。

module.exports = {
  moduleFileExtensions: ['ts', 'tsx', 'js'],
  transform: {
    '^.+\\.tsx?$': 'ts-jest',
  },
  testRegex: 'src/.*(/__tests__/.*|.test).tsx?$',
};

テストを試す

適当にsrc/index.test.ts辺りでこんなファイルを作ります。

test('test', () => {
  expect(1).toBe(1);
});

そしてyarn jestでテストが通れば完了です。

tsconfig.json を指定する

global['ts-jest'].tsConfigに使いたいtsconfig.xxx.jsonへのパスを渡すとその設定でテストを実行することができます。

module.exports = {
  globals: {
    'ts-jest': {
      tsConfig: 'tsconfig.test.json',
      diagnostics: true,
    },
  },
};

tsconfig の paths を jest でも効かせる

moduleNameMapperを指定します。

```js module.exports = { moduleNameMapper: { foo: '/src/foo/src/index.ts' } };

グローバルにインストールして使う

グローバルに Jest をインストール

yarnの人は、

yarn global add jest

npmの人は多分、

npm i -g jest

で入ると思います。

実行する

グローバルの Jest を実行するには設定ファイルを指定する必要があります。Jest を TypeScript と使う設定のような感じでどこかのディレクトリに環境を作り、その環境にあるjest.config.jsを指定してあげれば大丈夫です。

以下のような感じです。

jest --config=~/a-project/jest.config.js

--config 指定を省略する

shell の設定などでエイリアスとしてjestjest --config=~/a-project/jest.config.jsとなるようなエイリアスを登録します。

fish shell

fishでの設定は以下のコマンドを実行します。

echo "alias jest='jest --config=$HOME/environment/workbook/jest.config.js'" >> ~/.config/fish/config.fish

bash

bashの場合は~/.config/fish/config.fishの代わりに~/.bashrcに変えるだけです。

オブジェクト関連のメソッド

toBe

同じ格納場所を指しているかどうか

const obj = {};

expect(obj).toBe(obj);

上はパスしますが、いつからか下記のtoStrictEqualを使ってくださいというような警告が出るようになったので、toStrictEqualを使いましょう。

toStrictEqual

同じ格納場所じゃなくていいが、中身がまったく同じかどうか。

const expected = {foo: 123};
const value = {foo: 123};

// ok
expect(expected).toEqual(value);

toEqual

同じ格納場所じゃなくていいが、中身が同じかどうか。ただし値がundefinedのプロパティに関しては無くても良い。

const expected = {foo: 123, bar: undefined};
const value = {foo: 123};

// ok
expect(expected).toEqual(value);

ちなみに順番は同じじゃなくても良し。

const expected = {foo: 1};
const value = {foo: 1};

// ok
expect({foo: 1, bar: 2}).toEqual({bar: 2, foo: 1});

toMatchObject

同じ格納場所じゃなくて良くて、中身も完全に同じじゃなくても良期待していないプロパティは含めては駄目です。

const expected = {foo: 1, bar: 2};
const value = {foo: 1};

// ok
expect(expected).toMatchObject({foo: 1});
// fail
expect(expected).toMatchObject({foo: 1, baz: 3});