当前位置: 首页 > 知识库问答 >
问题:

测试未导出的TypeScript函数

戚飞
2023-03-14

我使用Mocha/Chai测试JavaScript前端代码,现在我们切换到TypeScript。我有几个功能要测试。但它们不应该出口。我是否可以在不向这些函数添加export的情况下访问这些函数并对其进行测试?

共有3个答案

申浩广
2023-03-14

虽然无法直接访问未导出的函数,但仍有一种方法可以以“半隐藏”的方式导出它们。一种可能的方法是:

// In your library module declare internal functions as non-exported like normal.
function someInternalFunctionA(x: number): number {
  return x;
}

function someInternalFunctionB(x: number): number {
  return x;
}

// At the bottom, offer a public escape hatch for accessing certain functions
// you would like to be available for testing.
export const _private = {
  someInternalFunctionA,
  someInternalFunctionB,
};

在测试端,您可以执行以下操作:

import { _private } from "./myModule";

test("someInternalFunctionA", () => {
  expect(_private.someInternalFunctionA(42)).toEqual(42);
});

我喜欢这种方法:

  • 无需直接用export标记someinternalfunction
公良琛
2023-03-14

正如您在相关问题中所看到的,在类或模块内测试私有函数的问题在StackOverflow上引起了激烈的争论——以下可能是一个架构解决方案,甚至不需要进行这种讨论:

如果这些功能足够重要,可以单独测试,但不应该作为模块的一部分进行访问,那么它们是否应该放在自己的模块中?

这将解决您的可访问性问题——它们现在是一个模块中的公共函数,您可以在另一个模块中轻松使用它们,而不会将它们作为该模块的一部分公开。

常源
2023-03-14

无法访问未导出的模块功能。

module MyModule {
    function privateFunction() {
        alert("privateFunction");
    }
}
MyModule.privateFunction(); // Generates a compiler error

然而,抛开私有方法测试的有效性问题不谈,下面是您可以做的事情。

将函数分组到一个实用类中,然后利用私有类成员可以通过方括号表示法访问这一事实。

module MyModule {
    export class UtilityClass {
        private privateFunction() {
            alert("privateFunction");
        }   
    }
}
var utility = new MyModule.UtilityClass();
//utility.privateFunction(); Generates a compiler error
utility["privateFunction"](); // Alerts "privateFunction"
 类似资料:
  • 我得到“只有void函数可以用'new'关键字调用”。我知道关键字在声明文件中是有效的,例如: 这只是导出一个类型,正如编译器所说:“只引用一个类型,但在这里被用作值”。 我不能在这里使用类,因为API可以通过来自其他文件的插件进行扩展,类型声明合并在类上不起作用(我希望其他文件添加的方法也能够通过它们自己的键入文件进行键入)。 我不知所措-有什么主意吗?

  • 最近,我构造了我的firebase函数,通过参考另一篇so文章,使目录具有更模块化的方法。 因此,firebase目录结构是 不同模块中的所有文件(除了utils之外)都作为firebase函数单独导出到最上面的index.js中。每个模块的index.js对每个函数进行全局导出。 主要的(最外面的)index.js 现在我想添加另一个模块,但不是该模块的所有功能都需要导出。这些未导出的函数被导入

  • 试图按照官方手册实现一个模块时,我收到了以下错误消息: 但在我的代码中没有任何地方使用过这个名称。 我该怎么解决这个?

  • 我有一个异步函数,我想同时测试成功和失败。函数成功时返回一个字符串,失败时抛出。我在测试失败上失败得很惨。下面是我的代码: 我通过注释失败的代码并在注释中添加结果来禁用 正如你所看到的,什么都不起作用。我相信我的测试几乎是第一个失败测试的Promises示例和最后一个失败测试的Async/Await示例的完全副本,但是没有一个可以工作。 我相信与Jest文档中的示例的不同之处在于,它们展示了如何测

  • 我有一个rest Spring Boot rest API,我想测试它。我可以在Eclipse中手动运行测试(不使用maven,并通过将应用程序作为JUnit测试运行),它运行良好并显示结果,但是不能“工作”,如下所示。 以下是我的POM文件: