1- # Mocks
1+ # Mock Functions
22
3- 用 ` vi.fn ` 即可创建 mock 函数或类,并全程记录其调用情况;若想监控已存在对象上的某个属性,则改用 ` vi.spyOn ` 。
3+ 我们可以使用 ` vi.fn ` 方法创建一个 mock 函数来跟踪其执行情况。如果要跟踪已创建对象上的方法,可以使用 ` vi.spyOn ` 方法:
44
55``` js
66import { vi } from ' vitest'
@@ -18,10 +18,10 @@ market.getApples()
1818getApplesSpy .mock .calls .length === 1
1919```
2020
21- 要验证 mock 的行为,请通过 [ ` expect ` ] ( /api/expect ) 调用类似 [ ` toHaveBeenCalled ` ] ( /api/expect#tohavebeencalled ) 的断言方法;以下 API 参考汇总了所有可用来操控 mock 的属性和方法 。
21+ 我们应该在 [ ` expect ` ] ( /api/expect ) 上使用 mock 断言(例如 [ ` toHaveBeenCalled ` ] ( /api/expect#tohavebeencalled ) )来断言 mock 结果。在这里我们介绍了用于操作 mock 行为的可用属性和方法 。
2222
2323::: tip
24- The custom function implementation in the types below is marked with a generic ` <T> ` .
24+ 下列类型中的自定义函数实现通过泛型 ` <T> ` 标记。
2525:::
2626
2727## getMockImplementation
@@ -42,7 +42,7 @@ function getMockImplementation(): T | undefined
4242function getMockName(): string
4343` ` `
4444
45- 此方法返回由 ` .mockName(name) ` 为 mock 指定的名称。 ` vi.fn() ` 创建的替身默认返回 ` ' vi.fn()' ` ; ` vi.spyOn ` 生成的 spy 则沿用被监视方法的原始名称 。
45+ 使用它来返回使用 ` .mockName(name) ` 方法分配给 mock 对象的名称。默认情况下,它将返回 ` vi.fn() ` 。
4646
4747## mockClear
4848
@@ -215,7 +215,7 @@ await asyncMock() // 抛出 Error<'Async error'>
215215function mockReset(): Mock<T>
216216` ` `
217217
218- 该方法会先执行与 [ ` mockClear ` ](# mockClear ) 相同的清理,再重置 mock 的实现,并一并清除所有一次性( once )设定 。
218+ 执行与 ` mockClear ` 相同的操作,并将内部实现设置为空函数(调用时返回 undefined )。这也会重置所有 “ once ” 实现。它对于将 mock 完全重置为其默认状态很有用 。
219219
220220注意:
221221
@@ -378,37 +378,6 @@ fn.mock.calls
378378]
379379` ` `
380380
381- :::warning 对象按引用存储。
382- 请注意,Vitest 在 ` mock ` 状态的所有属性中始终按引用保存对象。一旦你的代码修改了这些属性,诸如 [` .toHaveBeenCalledWith ` ](/ api / expect #tohavebeencalledwith ) 之类的断言便可能无法通过:
383-
384- ` ` ` ts
385- const argument = {
386- value: 0,
387- }
388- const fn = vi.fn()
389- fn(argument) // { value: 0 }
390-
391- argument.value = 10
392-
393- expect(fn).toHaveBeenCalledWith({ value: 0 }) // [!code --]
394-
395- // 相等性检查是针对原始参数进行的,
396- // 但是,该参数的属性在调用和断言之间发生了更改。
397- expect(fn).toHaveBeenCalledWith({ value: 10 }) // [!code ++]
398- ` ` `
399-
400- 此时,可先自行克隆该参数:
401-
402- ` ` ` ts{6}
403- const calledArguments = []
404- const fn = vi.fn((arg) => {
405- calledArguments.push(structuredClone(arg))
406- })
407-
408- expect(calledArguments[0]).toEqual({ value: 0 })
409- ` ` `
410- :::
411-
412381## mock .lastCall
413382
414383` ` ` ts
@@ -491,11 +460,6 @@ fn.mock.results
491460## mock .settledResults
492461
493462` ` ` ts
494- interface MockSettledResultIncomplete {
495- type: 'incomplete'
496- value: undefined
497- }
498-
499463interface MockSettledResultFulfilled<T> {
500464 type: 'fulfilled'
501465 value: T
@@ -509,16 +473,13 @@ interface MockSettledResultRejected {
509473export type MockSettledResult<T>
510474 = | MockSettledResultFulfilled<T>
511475 | MockSettledResultRejected
512- | MockSettledResultIncomplete
513476
514477const settledResults: MockSettledResult<Awaited<ReturnType<T>>>[]
515478` ` `
516479
517- 该数组按顺序记录了函数每次被调用后最终兑现或拒绝的值。
518-
519- 若函数返回的是非 Promise ,实际值会原封不动地保留,但状态仍被标记为 ` fulfilled ` 或 ` rejected ` 。
480+ 包含函数中 ` resolved ` 或 ` rejected ` 的所有值的数组。
520481
521- 在结果出来前,对应的 ` settledResult ` 类型始终为 ` incomplete ` 。
482+ 如果函数从未 resolved 或 rejected ,则此数组将为空 。
522483
523484` ` ` js
524485const fn = vi.fn().mockResolvedValueOnce('result')
0 commit comments