web-dev-qa-db-ja.com

依存関係のコンストラクターJestのモック

私はJestの初心者です。私は自分のものをモックすることができましたが、モジュールをモックしているように見えます。具体的にはコンストラクター。

usage.js

const AWS = require("aws-sdk")
cw = new AWS.CloudWatch({apiVersion: "2010-08-01"})
...
function myMetrics(params) { 
  cw.putMetricData(params, function(err, data){})
}

テストでこのようなことをしたいと思います。

const AWS = jest.mock("aws-sdk")
class FakeMetrics {
  constructor() {}
  putMetricData(foo,callback) {
    callback(null, "yay!")
  }
}

AWS.CloudWatch = jest.fn( (props) => new FakeMetrics())

ただし、usage.jsで使用するようになったとき、cwはmockConstructorではなくFakeMetricsです。

私のアプローチは「イディオムよりも少ない」かもしれないことを理解しているので、私はどんな指針にも大いに役立つでしょう。

これは最小限の例です https://github.com/ollyjshaw/jest_constructor_so

npm install -g jest

jest

16
Oliver Shaw

問題は、モジュールのモック方法です。 参照 状態として、

必要なときにモジュールを自動モックバージョンでモックします。 <...>チェーン用のjestオブジェクトを返します。

AWSはモジュールオブジェクトではなく、jestオブジェクトであり、AWS.CloudFormationは何も影響しません。

また、ある場所ではCloudWatchであり、別の場所ではCloudFormationです。

テストフレームワークでは、モック関数を再作成する必要はありません。既に存在しています。次のようになります。

const AWS = require("aws-sdk");
const fakePutMetricData = jest.fn()
const FakeCloudWatch = jest.fn(() => ({
    putMetricData: fakePutMetricData
}));                        
AWS.CloudWatch = FakeCloudWatch;

そして次のように主張しました:

expect(fakePutMetricData).toHaveBeenCalledTimes(1);
11
Estus Flask

上記の答えが機能します。ただし、しばらくしてjestを操作した後、コンストラクタをモックするのに役立つmockImplementation機能を使用するだけです。

以下のコードは一例です。

import * as AWS from 'aws-sdk';

jest.mock('aws-sdk', ()=> {
    return {
        CloudWatch : jest.fn().mockImplementation(() => { return {} })
    }
});

test('AWS.CloudWatch is callled', () => {
    new AWS.CloudWatch();
    expect(AWS.CloudWatch).toHaveBeenCalledTimes(1);
});

例ではnew CloudWatch()は空のオブジェクトを返すだけです。

4
kimy82

ドキュメントmockImplementationによると、クラスコンストラクターのモックにも使用できます。

// SomeClass.js
module.exports = class SomeClass {
  m(a, b) {}
};

// OtherModule.test.js
jest.mock('./SomeClass'); // this happens automatically with automocking
const SomeClass = require('./SomeClass');
const mMock = jest.fn();
SomeClass.mockImplementation(() => {
  return {
    m: mMock,
  };
});

const some = new SomeClass();
some.m('a', 'b');
console.log('Calls to m: ', mMock.mock.calls);
0
Developer Davo