测试未导出的TypeScript函数

时间:2015-08-10 15:02:38

标签: javascript typescript mocha chai

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

6 个答案:

答案 0 :(得分:7)

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

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"

答案 1 :(得分:3)

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

// 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);
});

我喜欢这种方法的地方:

  • 无需直接用 someInternalFunctionA 标记 export
  • 很明显,_private 下的内容并不是公共界面的正式组成部分。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我发现最好的解决方案是以不同的名称导出私有功能,因此该名称将提醒您不要在其他任何地方使用此功能。

export const getPriceTEST = getPrice;

function getPrice(): number {
  return 10 + Math.Random() * 50;
}

答案 4 :(得分:-1)

  

但它们不应该是可出口的。我是否可以访问此功能并在不向其添加导出的情况下对其进行测试?

一般来说,没有。可以访问私有类成员,但不能访问未导出的模块成员。

我会回应@Katana314的评论 - 单元测试不应该与非公开方法有关。尝试这样做表明您正在测试模块的实现细节,而不是模块声称要实现的合同。

答案 5 :(得分:-4)

这是一个彻头彻尾的黑客,但是嘿......

window.testing = {};

然后在你的模块中:

module.exports = {
    myPublicFunction: myPublicFunction
};

window.testing.myModule = {
    myPublicFunction: myPublicFunction,
    myPrivateFunction: myPrivateFunction
};