为了帮助您更好地了解输出的情况,让我们首先尝试遵循控制台中的语句。有一个链接指向错误发生的位置。它位于代码的第 10 行,即这一行:
expect(actual).toEqual(expected);
在此行设置断点并在调试模式下运行测试会显示actual
和expected
对象。
actual
值是(以 JSON 格式表示):
[
{
"frame": 3,
"notification": {"kind": "N", "value": "x", "hasValue": true}
},
{
"frame": 5,
"notification": {"kind": "N", "value": "y", "hasValue": true}
},
{
"frame": 7,
"notification": {"kind": "N", "value": "z", "hasValue": true}
},
{
"frame": 8,
"notification": {"kind": "C", "hasValue": false}
}
]
和expected
:
[
{
"frame": 1,
"notification": {"kind": "N", "value": "x", "hasValue": true}
},
{
"frame": 3,
"notification": {"kind": "N", "value": "y", "hasValue": true}
},
{
"frame": 5,
"notification": {"kind": "N", "value": "z", "hasValue": true}
},
{
"frame": 6,
"notification": {"kind": "C", "hasValue": false}
}
]
比较这两个数组,您可以看到frame
相同索引的每个对象的属性都不同。这个奇怪的输出来自 Jasmine 的toEqual函数,所以让我们尝试根据上面的值来理解它。来自控制台的这一行
Expected $[0].frame = 3 to equal 1.
意味着 1 的期望值不是 1,而是实际上是 3。这部分$[0].frame = 3
表明实际值是什么,这to equal 1
就是您作为开发人员认为应该是的值。即expected[0].frame
(即 1)不等于actual[0].frame
(即 3)。等等,expected[1].frame
不等于actual[1].frame
...
现在,您可能想知道为什么您甚至会为actual
和获得这样的值expected
。这在官方文档中有更详细的解释。当您使用此大理石图-x-y-z|
及其单位创建冷可观察对象delay
时2
,它会变成---x-y-z|
然后转换为可比较的东西 -actual
数组。前三个-
符号表示三个空的、不发光的帧。它们位于位置 0、1 和 2。它们在两个数组中的任何一个中都没有表示。
然后是第一个真正的价值x
。它表示为actual
数组 ( actual[0]
) 中的第一个对象。x
位于位置 3,因此该frame
属性具有相同的值。notification
属性有一些元数据,如value
发射项目的。您可以以相同的方式得出y
和的值。z
旁注:使用方法时,由于遗留原因run()
,帧在不使用时变为 1、2、3 等值,而不是 10、20、30 。run()