gpt4 book ai didi

javascript - 如何在另一个函数nodejs中模拟一个函数

转载 作者:搜寻专家 更新时间:2023-11-01 00:50:04 25 4
gpt4 key购买 nike

尝试为/utility/sqsThing.js 中的以下模块编写单元测试。但是,我很难模拟 sqs.sendMessage 方法。任何人都知道我应该怎么做。我正在使用 sinon 库和 mocha 来运行测试。

我正在尝试对 utility/sqsThing.js 进行单元测试的函数:

const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });
const outputQueURL = 'https:awsUrl';

const SQSOutputSender = (results) => {
const params = {
MessageBody: JSON.stringify(results),
QueueUrl: outputQueURL,
};
// Method that I want to mock
sqs.sendMessage(params, function (err, data) {
if (err) {
console.log('Error');
} else {
console.log('Success', data.MessageId);
}
});
};

我尝试在单元测试 sqsThingTest.js 中模拟 sqs.sendMessage 方法:

const sqsOutputResultSender = require('../utility/sqsThing');
const AWS = require('aws-sdk');
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });

const mochaccino = require('mochaccino');

const { expect } = mochaccino;
const sinon = require('sinon');


describe('SQS thing test', function() {
beforeEach(function () {
sinon.stub(sqs, 'sendMessage').callsFake( function() { return 'test' });
});

afterEach(function () {
sqs.sendMessage.restore();
});

it('sqsOutputResultSender.SQSOutputSender', function() {
// Where the mock substitution should occur
const a = sqsOutputResultSender.SQSOutputSender('a');
expect(a).toEqual('test');
})
});

使用 mocha tests/unit/sqsThingTest.js 运行这个单元测试但是我得到:AssertionError: expected undefined to deeply equal 'test'.信息:错误 AccessDenied:拒绝访问资源 https://sqs.us-east-1.amazonaws.com/。

看起来 mock 没有替换 aws api 调用。有人知道我如何在测试中模拟 sqs.SendMessage 吗?

最佳答案

你可以使用 rewire js它是一个库,可让您将模拟属性注入(inject)要测试的模块。

你的 require 语句看起来像这样:

var rewire = require("rewire");
var sqsOutputResultSender = rewire('../utility/sqsThing');

Rewire 将允许您模拟 sqsThing.js 文件顶级范围内的所有内容。

您还需要返回 sqs.sendMessage 的值,这将消除 expected undefined to deeply equal 'test' 的问题

只要有一个返回语句,你的原始文件看起来是一样的。

//utility/sqsThing.js
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });
const outputQueURL = 'https:awsUrl';

const SQSOutputSender = (results) => {
const params = {
MessageBody: JSON.stringify(results),
QueueUrl: outputQueURL,
};
// Method that I want to mock
return sqs.sendMessage(params, function (err, data) {
if (err) {
console.log('Error');
} else {
console.log('Success', data.MessageId);
}
});
};

然后您将按如下方式编写单元测试:

//sqsThingTest.js
var rewire = require("rewire");
var sqsOutputResultSender = rewire('../utility/sqsThing');
const mochaccino = require('mochaccino');
const { expect } = mochaccino;
const sinon = require('sinon');

describe('SQS thing test', function() {
beforeEach(function () {
sqsOutputResultSender.__set__("sqs", {
sendMessage: function() { return 'test' }
});
});

it('sqsOutputResultSender.SQSOutputSender', function() {
// Where the mock substitution should occur
const a = sqsOutputResultSender.SQSOutputSender('a');
expect(a).toEqual('test');
})
});

此示例返回一个具有 sendMessage 属性的对象,但这可以替换为 spy 。

Rewire Docs

关于javascript - 如何在另一个函数nodejs中模拟一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53341540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com