web-dev-qa-db-ja.com

Jestのオブジェクトの手動モック

私はジェストの手動モックを理解しようとしています。これは簡単だと思いますが、簡単ではありません。

私のプロジェクトディレクトリは

  • __tests __
    • user-test.js
  • モデル
    • user.js
    • __mocks __
      • user.js
  • node_modules
    • ...
  • package.json

Models/user.jsとmodels/__ mocks __/user.jsの両方に同じコードがあります:

module.exports = {
    create(username, password) {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve({"username":username, "password": password});
            }, 100);
        });
    }
}

ファイル__tests __/user-test.jsは次のようになります。

test('user creation works', () => {
    const user = require('../models/user');
    //const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

これは問題なく動作し、テストはパスしますが、次のように変更すると:

test('user creation works', () => {
    //const user = require('../models/user');
    const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

それは機能せず、吐き出します:

 FAIL  __tests__\user-test.js
  ● user creation works

    TypeError: user.create is not a function

      at Object.<anonymous>.test (__tests__\user-test.js:4:17)
      at process._tickCallback (internal\process\next_tick.js:103:7)
10
turiyag

ああ!理解した!私のフォルダ構造は問題ありません。 「jest.mock」が実際に何をしたかについて、私は誤解していることがわかりました。 "jest.mock"はノードの "require"関数の動作をモックを使用するように変更します。それ自体はrequireを行いません。

私のテストは次のようになるはずです:

jest.mock('../models/user');
test('user creation works', () => {
    const user = require('../models/user');
    return user.create("mitchell", "boo");
});
20
turiyag