JavaScript/TypeScript, 使用 Jest 写 unit test 。
一个文件里面有两函数
function a() {
//调用了其它 modules/files 里面的类或者函数
}
function b() {
a();
}
现在我用 Jest 测试 b,我想把 a mock 掉,请问有没有比较好的方法?
谢谢!
1
gbin 2020-05-21 07:40:52 +08:00 via Android
如果 a 和 b 的定位都是公有方法,那么可以模块化把 a, 和 b 都倒出,测 b 的时候把 a Mock 掉。
如果 a 的定位是私有方法,那么一般不用 Mock a,也不用专门给 a 写测试。单元测试的最小单位不一定是一个函数,可以是一个小模块,甚至一个类。 |
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 |
3
yazoox OP @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". |
4
ufo22940268 2020-05-21 09:28:13 +08:00
|
5
maichael 2020-05-21 09:49:23 +08:00
|
6
maichael 2020-05-21 09:50:00 +08:00
我觉得 John-Philip 的第一种方法优雅一点。
|
7
xiadong1994 2020-05-21 10:01:26 +08:00 1
我觉得没有 export 的内部方法不用直接测,没有 export 说明他只在文件内部有使用,通过测 export 的函数就可以覆盖到内部函数。
问题在于你为什么要 mock a 。如果是想通过 mock a 的返回值来覆盖 b 的分支,那么你应该用不同的 b 参数以及 mock 掉的外部调用的返回来控制 a 的返回值。 |