Typescript 模块导出函数的存根不工作

Typescript 模块导出函数的存根不工作,typescript,mocha.js,chai,sinon,Typescript,Mocha.js,Chai,Sinon,我试图从模块中存根导出的函数,以便替换返回值并检查函数是否已被调用 我已经创建了一个存根,测试已经完成,但是不知何故,存根没有在函数中使用,并且存根没有被调用一次 索引 import*作为“mqtt”中的mqtt /* */ 导出常量setupConnection=():mqtt.MqttClient=>{ 返回mqtt.connect(`someConfigAddress}:${someConfigPort}`) } 索引规范ts import*作为“mqtt”中的mqtt 将*作为mqtt

我试图从模块中存根导出的函数,以便替换返回值并检查函数是否已被调用

我已经创建了一个存根,测试已经完成,但是不知何故,存根没有在函数中使用,并且存根没有被调用一次

索引

import*作为“mqtt”中的mqtt
/*
*/
导出常量setupConnection=():mqtt.MqttClient=>{
返回mqtt.connect(`someConfigAddress}:${someConfigPort}`)
}
索引规范ts

import*作为“mqtt”中的mqtt
将*作为mqttClient从“路径/到/索引”导入
从“sinon”导入sinon
从“chai”导入{expect}
描述(“Mqtt客户端测试:”,()=>{
/*
*/
它('SetupConnection()应该调用connect一次',()=>{
const connectSpy=sinon.stub(mqtt,'connect')
connectSpy.callsFake(()=>this.fakeMqttClient)
mqttClient.setupConnection()
expect(connectSpy.called).to.be.true
})
})
文档中的指南也无法帮助我确保在
tsconfig.json
文件中设置了
“esModuleInterop”:true
,并将
import*作为mqtt从'mqtt'
语句更改为
import mqtt从'mqtt'

然后,它会很好地工作

例如

index.ts

import mqtt from 'mqtt';

const someConfigAddress = '127.0.0.1';
const someConfigPort = 6666;

export const setupConnection = (): mqtt.MqttClient => {
  return mqtt.connect(`${someConfigAddress}:${someConfigPort}`);
};
import mqtt from 'mqtt';
import * as mqttClient from './';
import sinon from 'sinon';
import { expect } from 'chai';

describe('Mqtt-Client Tests: ', () => {
  it('SetupConnection() should call connect once', () => {
    const connectSpy = sinon.stub(mqtt, 'connect');
    mqttClient.setupConnection();
    expect(connectSpy.called).to.be.true;
  });
});
index.test.ts

import mqtt from 'mqtt';

const someConfigAddress = '127.0.0.1';
const someConfigPort = 6666;

export const setupConnection = (): mqtt.MqttClient => {
  return mqtt.connect(`${someConfigAddress}:${someConfigPort}`);
};
import mqtt from 'mqtt';
import * as mqttClient from './';
import sinon from 'sinon';
import { expect } from 'chai';

describe('Mqtt-Client Tests: ', () => {
  it('SetupConnection() should call connect once', () => {
    const connectSpy = sinon.stub(mqtt, 'connect');
    mqttClient.setupConnection();
    expect(connectSpy.called).to.be.true;
  });
});
tsconfig.json

{
“编译器选项”:{
/*基本选择*/
“目标”:“ES2015”/*指定ECMAScript目标版本:“ES3”(默认)、“ES5”、“ES2015”、“ES2016”、“ES2017”、“ES2018”或“ESNEXT”。*/,
“模块”:“commonjs”/*指定模块代码生成:“无”、“commonjs”、“amd”、“系统”、“umd”、“es2015”或“ESNext”。*/,
“lib”:[
“ES2015”,
“ES2016”,
“ES2017”,
“ES2018”,
“ES2019”,
“ES2020”,
“下一步”
]/*指定要包含在编译中的库文件。*/,
//“allowJs”:true,/*允许编译javascript文件*/
//“checkJs”:true,/*报告.js文件中的错误*/
//“jsx”:“preserve”、/*指定jsx代码生成:“preserve”、“react native”或“react”*/
//“声明”:true,/*生成相应的“.d.ts”文件*/
//“declarationMap”:true,/*为每个对应的“.d.ts”文件生成源映射*/
//“sourceMap”:true,/*生成相应的“.map”文件*/
//“输出文件”:“/”、/*将输出连接并发送到单个文件*/
//“outDir”:“/”,/*将输出结构重定向到目录*/
//“rootDir”:“/”,/*指定输入文件的根目录。用于使用--outDir控制输出目录结构*/
//“composite”:true,/*启用项目编译*/
//“removeComments”:true,/*不向输出发送注释*/
//“noEmit”:true,/*不发出输出*/
//“导入器”:true,/*从“tslib”导入发出帮助器*/
//“downlevelIteration”:是的,/*在针对“ES5”或“ES3”时,在“for of”、“spread”和“destructuring”中为iterables提供全面支持*/
//“isolatedModules”:true,/*将每个文件作为单独的模块进行传输(类似于“ts.transpileModule”)*/
/*严格类型检查选项*/
//“strict”:true/*启用所有严格类型检查选项。*/,
“noImplicitAny”:false/*对隐含“any”类型的表达式和声明引发错误。*/,
“strictNullChecks”:true/*启用严格的null检查。*/,
“strictFunctionTypes”:true/*启用函数类型的严格检查。*/,
“strictPropertyInitialization”:true/*启用类中属性初始化的严格检查。*/,
“noImplicitThis”:true/*对隐含“any”类型的“this”表达式引发错误。*/,
“alwaysStrict”:true/*在严格模式下解析,并对每个源文件发出“use strict”。*/,
/*附加支票*/
//“NonuUsedLocals”:true,/*报告未使用的局部变量的错误*/
//“NonuUsedParameters”:true,/*报告未使用参数的错误*/
//“noImplicitReturns”:true,当函数中的所有代码路径都返回值时,/*报告错误*/
//“noFallthroughCasesInSwitch”:true,/*在switch语句中报告故障案例的错误*/
/*模块分辨率选项*/
//“moduleResolution”:“node”,/*指定模块解析策略:“node”(node.js)或“classic”(TypeScript pre-1.6)*/
//“baseUrl”:“/”、/*基本目录,用于解析非绝对模块名称*/
//“路径”:{},/*将导入重新映射到相对于“baseUrl”的查找位置的一系列条目*/
//“rootDirs”:[],/*根文件夹列表,其组合内容表示运行时项目的结构*/
//“typeRoots”:[“/node_modules/@types”,“/types”]/*包含来自.*/.的类型定义的文件夹列表,
//“类型”:[]/*编译中要包含的类型声明文件。*/,
//“allowSyntheticDefaultImports”:true,/*允许从没有默认导出的模块进行默认导入。这不会影响代码发出,只需进行类型检查*/
“esModuleInterop”:true/*通过为所有导入创建命名空间对象,实现CommonJS和ES模块之间的互操作性。表示“allowSyntheticDefaultImports”*/
//“preserveSymlinks”:true,/*不解析符号链接的实际路径*/
/*源地图选项*/
//“sourceRoot”:“”/*指定调试器应在其中定位TypeScript文件的位置,而不是源位置*/
//“mapRoot”:“,