[英]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.