模拟依赖项的构造函数 Jest

新手上路,请多包涵

我是 Jest 的新手。我已经设法模拟了自己的东西,但似乎被困在模拟模块中。特别是构造函数。

用法.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

原文由 Oliver Shaw 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 486
2 个回答

问题是如何模拟模块。正如 参考资料 所述,

在需要时模拟具有自动模拟版本的模块。 <…> 返回用于链接的笑话对象。

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);

原文由 Estus Flask 发布,翻译遵循 CC BY-SA 3.0 许可协议

以上答案有效。然而,在使用 jest 一段时间后,我将只使用 mockImplementation 功能,这对模拟构造函数很有用。

下面的代码可以是一个例子:

 import * as AWS from 'aws-sdk';

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

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

请注意,在示例中, new CloudWatch() 仅返回一个空对象。

原文由 kimy82 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题