给定两个函数。
export const func1 = (accessKeyId, secretAccessKeyID, region, queue, body) =>
new AWS.SQS({ accessKeyId, secretAccessKey: secretAccessKeyID, region })
.sendMessage({ QueueUrl: queue, MessageBody: body })
.promise();
export const func2 = (queue, body) => func1(config.key, config.secret, config.region, queue, body);
直接的函数。我想测试func2,并验证func1的调用是否正确,所以我有。
import { func1, func2 } from '../uploads';
import sinon from 'sinon';
describ('test 1', ()=> {
it('send job queue should send correct param to sendToSqs', async done => {
const spy = sinon.spy(func2);
const queue = 'test-queue';
const topic = 'test-topic';
const data = { field1: 'value1', field2: 'value2' };
await func1(queue, topic, data);
expect(spy.calledOnce).to.be.equal(true);
done();
});
});
运行上面的函数会出现错误
(node:29076) UnhandledPromiseRejectionWarning: UnknownEndpoint: Inaccessible host: `test-queue'. This service may not be available in the `us-east-1' region.
很明显,即使间谍被创建了,它仍然试图调用里面的函数。所以我觉得我这里有两个问题:1.这个 spy
似乎不相干 func2
,我错过了什么?2.我也许应该嘲笑一下。func1
也是。但是mock只适用于对象内部的函数。我如何在没有父对象的情况下只模拟一个函数?
你不能在一个独立的函数上进行stubspy。而且 func1
内称 func2
原汁原味 func1
,而不是存根版本。你需要做一些改变。
例如:
index.ts
:
import AWS from 'aws-sdk';
const config = {
key: 'key',
secret: 'secret',
region: 'region',
};
export const func1 = (accessKeyId, secretAccessKeyID, region, queue, body) =>
new AWS.SQS({ accessKeyId, secretAccessKey: secretAccessKeyID, region })
.sendMessage({ QueueUrl: queue, MessageBody: body })
.promise();
export const func2 = (queue, body) => exports.func1(config.key, config.secret, config.region, queue, body);
index.test.ts
:
import * as funcs from './';
import sinon from 'sinon';
describe('61964269', () => {
it('should pass', async () => {
const spy = sinon.stub(funcs, 'func1');
const queue = 'test-queue';
const topic = 'test-topic';
const data = { field1: 'value1', field2: 'value2' };
await funcs.func2(queue, data);
sinon.assert.calledWithExactly(spy, 'key', 'secret', 'region', 'test-queue', {
field1: 'value1',
field2: 'value2',
});
});
});
我们使用 exports.func1
和 import * as funcs from './'
,所以 func1
将被保存在一个对象中- module.exports
对象。然后,我们可以将 func1
在我们的测试文件中,当我们调用 func2
.
单元测试的结果。
61964269
✓ should pass
1 passing (11ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 83.33 | 100 | 50 | 80 |
index.ts | 83.33 | 100 | 50 | 80 | 10
----------|---------|----------|---------|---------|-------------------