簡體   English   中英

測試未導出的 TypeScript 函數

[英]Testing TypeScript function which is not exported

我使用 Mocha/Chai 來測試 JavaScript 前端代碼,現在我們切換到 TypeScript。 我有幾個要測試的功能。 但它們不應該是可出口的。 我可以訪問此功能並對其進行測試而不添加export嗎?

無法訪問非導出的模塊函數。

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"

雖然無法直接訪問非導出函數,但仍然可以通過“半隱藏”方式導出它們。 一種可能的方法是:

// 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標記someInternalFunctionA
  • _private下的東西不是公共接口的正式組成部分,這應該仍然是非常明顯的。

正如您在相關問題中所看到的,在 StackOverflow 上對在類或模塊中測試私有函數的問題進行了激烈的辯論 - 以下可能是一種架構解決方案,甚至沒有進行這種討論:

如果這些功能足夠重要,可以單獨測試,但不應作為模塊的一部分訪問,是否應該將它們放在自己的模塊中?

這將解決您的可訪問性問題 - 它們現在是一個模塊中的公共函數,您可以輕松地從另一個模塊中使用它們,而不是將它們作為該模塊的一部分公開。

我發現的最佳解決方案是以不同的名稱導出私有函數,因此該名稱會提醒您不要在其他任何地方使用此函數。

export const getPriceTEST = getPrice;

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

但它們不應該是可出口的。 我可以訪問此功能並對其進行測試而不添加導出嗎?

一般來說,沒有。 可以訪問私有類成員,但不能訪問模塊的未導出成員。

我會回應@Katana314 的評論——單元測試不應該與非公共方法有關。 嘗試這樣做表明您正在測試模塊的實現細節,而不是模塊聲稱要實現的契約。

這是一個徹頭徹尾的黑客,但是嘿......

window.testing = {};

然后在你的模塊中:

module.exports = {
    myPublicFunction: myPublicFunction
};

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM