我可以在编写 TypeScript 单元测试时修补依赖项吗

Can I monkey-patch dependencies when writing TypeScript unit tests

我们的 Web 应用程序有一个非常丰富的 Javascript 前端,有大量自定义小部件、向导等。我们正在考虑将其中的一些(可能最终全部)迁移到 TypeScript,主要是为了更容易 refactoring/fewer 错误的好处。

我们已经对 widgets/client-side 业务逻辑进行了 JavaScript 单元测试 - 我们通过 Karma 运行 进行了测试。目前我们的断言都使用 YUI 测试框架,但我们并不特别依赖它。

由于我们将代码库转移到 TypeScript,因此考虑也用 TypeScript 编写一些固定装置似乎是合理的(为了同样的好处)。另请注意,我们的 TypeScript 代码的 JavaScript 输出不如我们手工编写的 JavaScript 代码那么友好,所以这是另一个原因(想要针对 TypeScript 编写测试)。

目前,我们的一些单元测试将 "monkey-patch" 依赖项来询问被测代码。例如,我们可以将浏览器的 XmlHttpRequest 对象替换为模拟对象,以便我们可以推断我们的代码如何与 real XmlHttpRequest 对象交互。

我们目前通过在测试期间替换依赖项来做到这一点,例如window.XmlHttpRequest = MyMockObject;

有没有人对这种做法有任何想法,特别是关于在 TypeScript 中实现它与 JavaScript 有何不同的想法?

请注意,我不喜欢仅仅为了使单元测试更容易而修改我们的代码(例如,要求始终注入依赖项而不是假定存在依赖项)。

sinon 库(具有 TypeScript 的绑定)已经这样做了,特别支持伪造 XMLHttpRequest(和计时器)。尽可能使用它似乎是最好的选择。

有很多方法可以绕过 TypeScript 中的类型检查,例如

  • 正在分配 any 类型的值(始终允许)
  • 编写一个 JavaScript 函数来为您完成肮脏的工作(然后为该函数编写一个 TypeScript 定义)。这基本上就是在使用 TypeScript
  • 的 sinon FakeXMLHttpRequest 功能时发生的情况
  • eval("foo = valueOfWrongType;");