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