簡體   English   中英

如何從導入的 ES6 模塊中存根構造函數?

[英]How to stub a constructor from an imported ES6 module?

我想在測試文件中存根類的構造函數。 說我有以下內容:

// Foo.js
export class Foo {}

// myTestFile.js
import {Foo} from "./Foo.js";
import {functionThatUsesFoo} from "./functionThatUsesFoo.js";

class ReplacedFoo {}

// do something to replace `Foo` with `ReplacedFoo` here...

functionThatUsesFoo();

是否有一些神奇的Object.setPrototypeOf()Foo.prototype = ReplacedFoo之類的調用,我可以確保functionThatUsesFoo()使用我的存根構造函數。 我不想訴諸依賴注入。

我發現的關於這個主題的大多數資源都在使用 nodejs require()和一個在內部使用 node:vm 的測試庫。 但我正在使用不易獲得的 Deno/瀏覽器環境。

我嘗試過的一些事情:

  • Foo.constructor = ReplacedFoo.constructor
  • Foo.prototype.constructor = ReplacedFoo.prototype.constructor
  • Foo.prototype = ReplacedFoo.prototype
  • Foo.prototype = ReplacedFoo
  • Object.setPrototypeOf(Foo, ReplacedFoo.prototype)

我制作了一個庫來解決此類情況,允許您替換導入文件的內容。 但它有一些不可避免的限制,所以我想盡可能避免它。 同樣,使用導入映射來解決這個問題也不是一個真正令人滿意的解決方案,因為它不能很好地擴展,我還不如在那時使用該庫。

使用 .mjs,您基本上想重新編寫代碼以在任何地方進行依賴注入。 和雙胖箭頭的功能:P

const makeFunctionThatUsesFoo = (fooInstance) => (funcAgs) => {
 console.log('I feel secure, but stubs stoped working')
}

暫無
暫無

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

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