繁体   English   中英

Typescript:是否可以存根声明的 function 进行单元测试?

[英]Typescript: Is it possible to stub a declared function for a unit test?

对于上下文,我正在编写 typescript,它被编译成 javascript,与汇总捆绑在一起,然后由框架调用。 这个框架在全局scope中为我提供了一个库。 这是一个看起来像这样的 function:

    fun({
      prop1: number,
      ...
    });

我不想将此库包含在我捆绑的 JavaScript 中,因为它已经由框架提供。 如果我的代码中的库版本与框架的不同,我认为这可能会引入很多奇怪的错误。 从理论上讲,我认为只使用框架提供的库会更不容易出错并且更简单。

我做了一些研究,我认为declare关键字就是为了这个目的。 所以我把它放在我称之为fun的同一个文件中:

export declare function fun(input: unknown): void;

现在我的代码可以编译了,但我还没有找到一种对生产代码进行单元测试的方法。 如果我调用调用fun的代码,jasmine 会抱怨 function 不存在: ReferenceError: fun is not defined

我理解为什么会发生这个错误,但我不知道如何解决它。 我尝试使用 sinon 来存根fun ,但是当我在 Jasmine 中运行我的测试时,它也有类似的关于fun不存在的抱怨。

我想出了一个我讨厌的解决方法:我将fun的调用包装在if语句中,这样测试就跳过了fun的调用。

我想知道是否有某种方法来存根fun以便我可以执行调用它的代码并确认正在传入正确的属性。或者,有没有一种方法可以编写fun的假版本并将其排除在转译stub ,所以它可以用于测试,但在生产中不存在? 鉴于模块的工作方式,我认为这不是一个选择。 但我对各种想法持开放态度,这就是我提出它的原因。

这个解决方案对我有用。 如果有更好/更简单的方法,我想知道。

    // in some file (you must have an import/export in it or else it won't compile
    declare global {
      interface Window {
        fun: (input: unknown) => void;
      }
    }
    
    // in the test
      beforeEach(() => {
        sandbox = sinon.createSandbox();
        window.anime = sandbox.stub();
      });
    
      afterEach(() => {
        window.anime = ... // Optional. Put it back the way I found it
      });
    
    // somewhere in a test
       expect((window.fun as SinonStub).callCount).toBeGreaterThan(0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM