私は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
問題は、モジュールのモック方法です。 参照 状態として、
必要なときにモジュールを自動モックバージョンでモックします。 <...>チェーン用の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);
上記の答えが機能します。ただし、しばらくして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()は空のオブジェクトを返すだけです。
ドキュメント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);