vi.spyOn 在同一属性的 `get` 和 `set` 上: restore 会重新安装兄弟模拟对象
描述错误
当“vi.spyOn”(obj,密钥,'get')”和“vi.spyOn(obj,密钥,'set')”都安装在同一财产上时,恢复财产不会恢复原状。
康斯特目标={ 值:'原'} 对象. define Property( 目标, “ prof”, { 获取(){返回目标。 数值( V), 设置(值){目标. 值=值}, 可塑:真实, ) (中文(简体) ).
vi. spyOn(目标,'道克','get'). mock ReturnValue("被锁定") v. spyOn(目标, “ proc” , “ set” ). mock 实现 (( () ) QQQQ) vi.restore AllMocks( ) (中文( ) ).
object.prop // “ mocked” - 预期的“ 原始”
这不是用户的订单错误 。 恢复一个"单身"间谍,也默默地去除那些应该仍然活跃的同性戀间谍:
const getSpy = vi. spyOn(目标,"道克","get"). mock ReturnValue ("mocked").
const setSpy = vi. spyOn(目标,"prop"," set"). mock executive (() QQ) QQ
获取Spy.mockRestore ()
target.prop="已写"
spy.mock.calls // [] - 设置间谍被消灭间谍先是 " set " ,后是 " get " ,取而代之的是被嘲笑的** setter**,对于从原型中继承下来的进入者来说,一个虚假的自有地产被留放在例上,给原型留下阴影。 相关的复制涵盖所有四个案件。
失败模式是沉默的:一个被被嘲笑的得到者不会产生出任何错误,因此在环境的余生中,它会不断返回被嘲笑的值. 使用“同位素:假” (或任何跨文件重用环境的池配置),它会漏入以后的每个测试文件。 在我们的Angular套房里,一个被写在一个Spec文件上的间谍使一个不相干的Spec文件以错误的值出故障;因为受害者带着文件的订单四处移动,工人们计算它看起来像一个随机的片段,它用了一个二分形超过725个文件来追踪它.
根原因
在packages/spy/src/index.ts'中,重新指定()'从原始描述 ' 中重建**全**描述符——即*间谍创建时拍摄的快照——只覆盖自己的AccessType':
重新指派=(cb: 任何){{ ========== ==================================================================================================================================================================================================================================================== 可塑:真实, 可写: 是真的, {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 如果(AccessType !====================================================================================================================================================================== 删除可删除的 desc.writable {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? ; (说明作为属性描述符) [accessType]= cb 对象. define Property(对象,密钥, desc) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
康斯特还原= () {{{{} (原始内容存档于2013-10-12) (中文(简体) ). { 反射.delete Property(对象,密钥) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 其它如果 (原始内容 Q!) { 对象. define Property(对象,密钥,原始描述符) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 其它则{ (原始内容) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
到了第二次"spyOn"运行时,第一个间谍的模拟器已经安装好,因此第二个间谍的快照包含在**相亲**插槽中的模拟器,它的"restore ()"写回了它. `恢复AllMocks ()' 重复了`MOCK-RESTORE' (`Set',即创建命令),因此被污染的快照最后适用,并获胜:
步骤 实际描述 间谍的快照
| -- -- -- -- -- -- -- -- -- -- -- -- --
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
. . . . . . .内容来源: vitest-dev/vitest