V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yazoox
V2EX  ›  JavaScript

Jest 写 unit test,如何 mock 同一个文件中被调用的函数?

  •  1
     
  •   yazoox · 2020-05-21 07:26:50 +08:00 · 3067 次点击
    这是一个创建于 1674 天前的主题,其中的信息可能已经有所发展或是发生改变。

    JavaScript/TypeScript, 使用 Jest 写 unit test 。

    一个文件里面有两函数

    function a() {
      //调用了其它 modules/files 里面的类或者函数
    }
    
    function b() {
      a();
    }
    

    现在我用 Jest 测试 b,我想把 a mock 掉,请问有没有比较好的方法?

    谢谢!

    7 条回复    2020-05-21 10:01:26 +08:00
    gbin
        1
    gbin  
       2020-05-21 07:40:52 +08:00 via Android
    如果 a 和 b 的定位都是公有方法,那么可以模块化把 a, 和 b 都倒出,测 b 的时候把 a Mock 掉。
    如果 a 的定位是私有方法,那么一般不用 Mock a,也不用专门给 a 写测试。单元测试的最小单位不一定是一个函数,可以是一个小模块,甚至一个类。
    ufo22940268
        2
    ufo22940268  
       2020-05-21 08:09:03 +08:00
    ```js
    function a() {
    //调用了其它 modules/files 里面的类或者函数
    }

    a = jest.fn()
    function b() {
    a();
    }

    expect(a).toBeCalled()
    ```

    https://jestjs.io/docs/en/mock-functions.html
    yazoox
        3
    yazoox  
    OP
       2020-05-21 09:12:20 +08:00
    @ufo22940268 兄弟,没有这么简单吧。你这是 test 代码和 prod 代码在同一文件内么?
    xxx.js
    ```javascript
    function a() {
    //调用了其它 modules/files 里面的类或者函数
    }

    function b() {
    a();
    }
    ```


    xxx.test.js
    ```
    import {a, b} from "./xxx.js";


    a = jest.fn();
    ```
    这里是会报错的,"can't assign to a because it is not a variable".
    ufo22940268
        4
    ufo22940268  
       2020-05-21 09:28:13 +08:00
    maichael
        6
    maichael  
       2020-05-21 09:50:00 +08:00
    我觉得 John-Philip 的第一种方法优雅一点。
    xiadong1994
        7
    xiadong1994  
       2020-05-21 10:01:26 +08:00   ❤️ 1
    我觉得没有 export 的内部方法不用直接测,没有 export 说明他只在文件内部有使用,通过测 export 的函数就可以覆盖到内部函数。
    问题在于你为什么要 mock a 。如果是想通过 mock a 的返回值来覆盖 b 的分支,那么你应该用不同的 b 参数以及 mock 掉的外部调用的返回来控制 a 的返回值。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2285 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:06 · PVG 00:06 · LAX 08:06 · JFK 11:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.