1+ import { runCallback , createObject , getData } from './07.mock'
2+ import axios from 'axios'
3+
4+ /**
5+ * mock作用:
6+ * 1. 捕获函数的调用和返回结果,以及this和调用顺序
7+ * 2. 自由设置返回结果
8+ * 3. 改变函数内部实现
9+ */
10+ test ( '测试 callback 是否被执行' , ( ) => {
11+ // 使用 jest 生成一个 mock 函数,用来捕获函数调用
12+ const func1 = jest . fn ( )
13+
14+ // 模拟返回数据
15+ func1 . mockReturnValueOnce ( 456 ) . mockReturnValueOnce ( 789 )
16+ // func1.mockReturnValue(10)
17+
18+ // 定义带返回的mock函数
19+ const func2 = jest . fn ( ( ) => { return 456 } )
20+ // 等价于
21+ func2 . mockImplementation ( ( ) => { return 456 } )
22+ // func2.mockImplementationOnce(() => { return this })
23+ // func2.mockReturnThis
24+
25+ // 执行3次func1,1次func2
26+ runCallback ( func1 )
27+ runCallback ( func1 )
28+ runCallback ( func1 )
29+ runCallback ( func2 )
30+
31+ // 被执行
32+ expect ( func1 ) . toBeCalled ( )
33+ // 调用次数
34+ expect ( func1 . mock . calls . length ) . toBe ( 3 )
35+ // 传入参数
36+ expect ( func1 . mock . calls [ 0 ] ) . toEqual ( [ 123 ] )
37+ expect ( func1 ) . toBeCalledWith ( 123 )
38+ // 返回结果
39+ expect ( func2 . mock . results [ 0 ] . value ) . toBe ( 456 )
40+
41+ // 输出mock
42+ console . log ( func1 . mock )
43+ /*
44+ {
45+ calls: [ [ 123 ], [ 123 ], [ 123 ] ],
46+ instances: [ undefined, undefined, undefined ],
47+ invocationCallOrder: [ 1, 2, 3 ],
48+ results: [
49+ { type: 'return', value: 456 },
50+ { type: 'return', value: 789 },
51+ { type: 'return', value: undefined }
52+ ]
53+ }
54+ */
55+ } )
56+
57+ test ( '测试 createObject' , ( ) => {
58+ const func = jest . fn ( )
59+ createObject ( func )
60+ console . log ( func . mock )
61+ /*
62+ {
63+ calls: [ [] ],
64+ instances: [ mockConstructor {} ],
65+ invocationCallOrder: [ 1 ],
66+ results: [
67+ { type: 'return', value: undefined }
68+ ]
69+ }
70+ */
71+ } )
72+
73+ // jest 模拟 axios 请求
74+ jest . mock ( 'axios' )
75+ test ( '测试 axios getData' , async ( ) => {
76+ // 模拟函数的返回,getData 不会真正发起 axios 请求
77+ axios . get . mockResolvedValueOnce ( { data : 'hello' } )
78+ axios . get . mockResolvedValueOnce ( { data : 'world' } )
79+ // axios.get.mockResolvedValue({ data: 'hello' })
80+ await getData ( ) . then ( ( data ) => {
81+ expect ( data ) . toBe ( 'hello' )
82+ } )
83+ await getData ( ) . then ( ( data ) => {
84+ expect ( data ) . toBe ( 'world' )
85+ } )
86+ } )
0 commit comments