RxJs大理石测试:断言失败日志难以理解

时间:2019-01-11 15:28:25

标签: testing rxjs rxjs6 rxjs-marbles

我有这个Rxjs测试代码。它故意失败了,因为我想向您显示失败的日志。我觉得很难理解,或者至少我无法流利地阅读它。

有人可以向我解释什么意思:$[i].frame = i' to equals i''

import { delay } from 'rxjs/operators';
import { TestScheduler } from 'rxjs/testing';

describe('Rxjs Testing', () => {

  let s: TestScheduler;

  beforeEach(() => {
    s = new TestScheduler((actual, expected) => {
      expect(actual).toEqual(expected);
    });
  });

  it('should not work', () => {
    s.run(m => {
      const source = s.createColdObservable('-x-y-z|');
      const expected = '-x-y-z|'; // correct expected value is '---x-y-z|'

      const destination = source.pipe(delay(2));
      m.expectObservable(destination).toBe(expected);
    });
  });
});

enter image description here

1 个答案:

答案 0 :(得分:2)

为帮助您更好地理解输出的内容,让我们首先尝试遵循控制台中的语句。有一个链接指向错误发生的位置。在这行代码的第10行:

expect(actual).toEqual(expected);

在此行上设置断点并在调试模式下运行测试将显示actualexpected个对象。

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 ...

现在,您可能想知道为什么还要为actualexpected得到这样的值。 official docs对此进行了更详细的说明。当您使用此大理石图-x-y-z|delay2单位创建冷可观察物时,它变成---x-y-z|,然后转换为可比较的东西-actual数组。前三个-符号表示三个空的非发射帧。它们位于位置0、1和2。在两个数组中的任何一个中都没有表示形式。

然后是第一个实际值x。它表示为actual数组(actual[0])中的第一个对象。 x在位置3,因此frame属性具有相同的值。 notification属性具有一些元数据,例如所发射项目的value。您可以用相同的方式得出yz的值。

旁注:对于legacy reasons,当使用run()方法时,帧变为1、2、3等值,而不是run()时,帧变为10、20、30等值。