Javascript Sinon无法验证内部函数是否调用过一次
给定两个函数:Javascript Sinon无法验证内部函数是否调用过一次,javascript,testing,mocha.js,chai,sinon,Javascript,Testing,Mocha.js,Chai,Sinon,给定两个函数: export const func1 = (accessKeyId, secretAccessKeyID, region, queue, body) => new AWS.SQS({ accessKeyId, secretAccessKey: secretAccessKeyID, region }) .sendMessage({ QueueUrl: queue, MessageBody: body }) .promise(); export const
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只适用于对象内部的函数。如何在没有父对象的情况下模拟函数?您不能在独立函数上存根/监视。而且,在func2
中调用的func1
始终是原始func1
,而不是存根版本。您需要做一些更改:
例如
index.ts
:
从“AWS sdk”导入AWS;
常量配置={
键:“键”,
秘密:“秘密”,
地区:'地区',
};
export const func1=(accessKeyId、secretAccessKeyID、region、queue、body)=>
新的AWS.SQS({accessKeyId,secretAccessKey:secretAccessKeyID,region})
.sendMessage({QueueUrl:queue,MessageBody:body})
.promise();
export const func2=(队列,主体)=>exports.func1(config.key,config.secret,config.region,队列,主体);
index.test.ts
:
import*作为函数从“/”导入;
从“sinon”进口sinon;
描述('61964269',()=>{
它('should pass',async()=>{
const spy=sinon.stub(funcs,'func1');
常量队列='测试队列';
常量主题='测试主题';
常量数据={field1:'value1',field2:'value2'};
等待函数func2(队列、数据);
sinon.assert.calledWithJustice(间谍、密钥、机密、区域、测试队列){
字段1:'值1',
字段2:‘值2’,
});
});
});
我们使用exports.func1
和import*作为“/”中的funcs,这样func1
将保存在对象-模块.exports
对象中。然后,我们可以在测试文件中存根func1
,当我们调用func2
时就会调用它
单元测试的结果:
61964269
✓ 应该通过
1次通过(11毫秒)
----------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
----------|---------|----------|---------|---------|-------------------
所有文件| 83.33 | 100 | 50 | 80 |
指数.ts | 83.33 | 100 | 50 | 80 | 10
----------|---------|----------|---------|---------|-------------------