I’m a newbie to Jest. I’ve managed to mock my own stuff, but seem to be stuck mocking a module. Specifically constructors.
usage.js
const AWS = require("aws-sdk") cw = new AWS.CloudWatch({apiVersion: "2010-08-01"}) ... function myMetrics(params) { cw.putMetricData(params, function(err, data){}) }
I’d like to do something like this in the tests.
const AWS = jest.mock("aws-sdk") class FakeMetrics { constructor() {} putMetricData(foo,callback) { callback(null, "yay!") } } AWS.CloudWatch = jest.fn( (props) => new FakeMetrics())
However when I come to use it in usage.js
the cw is a mockConstructor
not a FakeMetrics
I realise that my approach might be ‘less than idiomatic’ so I’d be greatful for any pointers.
This is a minimal example https://github.com/ollyjshaw/jest_constructor_so
npm install -g jest
jest
Advertisement
Answer
The problem is how a module is being mocked. As the reference states,
Mocks a module with an auto-mocked version when it is being required. <…> Returns the jest object for chaining.
AWS
is not module object but jest
object, and assigning AWS.CloudFormation
will affect nothing.
Also, it’s CloudWatch
in one place and CloudFormation
in another.
Testing framework doesn’t require to reinvent mock functions, they are already there. It should be something like:
const AWS = require("aws-sdk"); const fakePutMetricData = jest.fn() const FakeCloudWatch = jest.fn(() => ({ putMetricData: fakePutMetricData })); AWS.CloudWatch = FakeCloudWatch;
And asserted like:
expect(fakePutMetricData).toHaveBeenCalledTimes(1);