RxJs 弹珠测试:断言失败日志难以理解

bub*_*les 4 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);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

lag*_*man 5

为了帮助您更好地理解输出的情况,我们首先尝试跟踪控制台中的语句。有一个链接指向发生错误的位置。它位于第 10 行代码,即这一行:

expect(actual).toEqual(expected);
Run Code Online (Sandbox Code Playgroud)

在该行设置断点并在调试模式下运行测试会显示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}
  }
]
Run Code Online (Sandbox Code Playgroud)

还有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}
  }
]
Run Code Online (Sandbox Code Playgroud)

比较两个数组,您可以看到frame相同索引的每个对象的属性都不同。这个奇怪的输出来自 Jasmine 的toEqual函数,所以让我们尝试根据上面的值来理解它。来自控制台的这一行

Expected $[0].frame = 3 to equal 1.
Run Code Online (Sandbox Code Playgroud)

意味着 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

旁注:当使用method 时,由于遗留原因,run()帧变为 1、2、3 等值,而不是不使用时的 10、20、30 。run()