【问题标题】:Mocking/Stubbing a Typescript interface with jest用玩笑模拟/存根 Typescript 接口
【发布时间】:2019-06-27 20:17:37
【问题描述】:

是否可以通过 Jest 或其他模拟/存根库来模拟或存根 Typescript 接口?

例如,我想模拟 ExpressJS 的 Response 对象: export interface Response extends http.ServerResponse, Express.Response

我正在寻找一个库来为我做这件事,而不是手工制作一个实现所有方法的对象。

【问题讨论】:

    标签: typescript unit-testing jestjs


    【解决方案1】:

    我最终为它使用了类型断言,这有点小题大做。所以像:

    const res = {} as Express.Response;
    

    关于type assertions is available here的一些信息说:

    类型断言是告诉编译器“相信我,我知道我在做什么”的一种方式。类型断言类似于其他语言中的类型转换,但不执行数据的特殊检查或重组。它没有运行时影响,并且纯粹由编译器使用。 TypeScript 假定您(程序员)已经执行了您需要的任何特殊检查。

    【讨论】:

    • 如果你想实际调用一个方法或获取你的模拟对象中的一个属性的值,你会遇到问题。由于这个对象是空的,当你尝试这样做时,你会得到一个错误。
    • @Sefe 是的,感谢您指出这一点。我将为将要调用的方法实现我自己的存根。我想为它获得一个通用的模拟/存根作为基础。
    【解决方案2】:

    灵感来自@n00b,但更完整:

    首先使用类型断言到未知,然后使用您想要的接口,以使编译器接受它。

    然后mock你需要的东西(在这个例子中,myFunction调用Response.send,你将需要或多或少地mock)

    一个完整的例子,这可以在__tests__/myFunctionTest.ts文件中:

    import * as functions from 'firebase-functions';
    import * as myfunction from '../src/myFunction';
    test('it should do the thing', () => {
      const req = { } as unknown;
      const mockReq = req as functions.https.Request;
      const res = { send: jest.fn() } as unknown;
      const mockRes = res as functions.Response;
      myFunction.doTheThing(mockReq, mockRes);
      expect(mockRes.send).toBeCalledWith("{ 'status': 'the thing is done' }";
    });
    

    src/myFunction.ts 文件将是:

    import * as functions from 'firebase-functions';
    
    export const doTheThing = functions.https.onRequest((request, response) => {
      response.send("{ 'status': 'the thing is done' }");
    });
    

    请注意,这与 Express 所需的模拟非常接近 - firebase 函数请求/响应建立在那些 Typescript 接口上,因此应该应用该策略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2021-01-06
      • 2020-02-08
      相关资源
      最近更新 更多