4

uuid/v4npm からのモジュールをモックしてみます。そのために、 jest の提案に従ってモック フォルダーを作成しました: https://jestjs.io/docs/en/manual-mocks

私のフォルダ構造:

├──__mocks__ 
|  └──uuid
|       └──v4.ts
├──src
│   └──__tests__
│   └── ...
├──node_modules

モック ノード モジュール ファイルv4.ts :

module.exports = jest.fn();

テスト ファイルに uuid/v4 をインポートしようとすると、jest は通常、モックをインポートし、それで遊ぶことができるはずです。

ここに私のテストファイル:

import uuidv4 from 'uuid/v4';

it('should create a job', () => {
    const jobId = 'fake-job-id';
    uuidv4.mockReturnValue(jobId); 
    ...
}

残念ながら、mockReturnValuejest によって提供されたものを追加できず、次のタイプスクリプト エラーがあるため、モック インポートは機能していないようです。 property 'mockReturnValue' does not exist on type v4. ts(2339)

どうすれば修正できますか?事前に感謝します。

4

1 に答える 1

7

jest.Mockedこのような状況を処理する一般的な方法は、テストでモジュールを自動モックし、次のように使用してモジュールが自動モックされることを TypeScript に伝えることです。

jest.mock('uuid/v4');  // <= auto-mock uuid/v4

import uuidv4 from 'uuid/v4';
const mocked = uuidv4 as jest.Mocked<typeof uuidv4>;  // <= tell TypeScript it's an auto-mock

test('hi', () => {
  mocked.mockReturnValue('mocked result');  // <= use the properly typed mock
  expect(uuidv4()).toBe('mocked result');  // Success!
})

残念ながら、uuid/v4このアプローチでは for の入力が正しく機能しないようです。

回避策として、型アサーションを使用できます。

jest.mock('uuid/v4');  // <= auto-mock uuid/v4

import uuidv4 from 'uuid/v4';

test('hi', () => {
  (uuidv4 as jest.Mock).mockReturnValue('mocked result');  // <= use a type assertion
  expect(uuidv4()).toBe('mocked result');  // Success!
})
于 2019-09-04T16:50:29.580 に答える