【问题标题】:RxJs marble testing : Assertion fail log hard to understandRxJs 弹珠测试:断言失败日志难以理解
【发布时间】:2019-06-06 13:11:04
【问题描述】:

我有这个 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);
    });
  });
});

【问题讨论】:

  • frameTestScheduler 中时间的内部表示。我认为您可以将其视为每个异步操作都会创建一个新框架并递增TestScheduler 的内部计数器。我认为大理石图中的每个- 代表 10 帧,但也许这已经改变了(可能是 1?)。所以错误告诉你发射发生的时间与你预期的不同。
  • 我认为 - 等于 1,这可以通过延迟 (2) 和期望日志来解释(总是有 2 的差异)。 >你的意思是(x,y,z)在测试中?

标签: testing rxjs rxjs6 rxjs-marbles


【解决方案1】:

为了帮助您更好地了解输出的情况,我们首先尝试遵循控制台中的语句。有一个链接指向错误发生的位置。它在第 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 是您作为开发人员认为的应该是什么。 IE。 expected[0].frame(即 1)不等于 actual[0].frame(即 3)。以此类推,expected[1].frame不等于actual[1].frame...

现在,您可能想知道为什么您会得到 actualexpected 的这些值。这在official docs 上有更详细的解释。当您使用此大理石图-x-y-z|delay 创建冷可观察对象时,它使用2 单位,它变成---x-y-z|,然后转换为类似的东西 - 一个actual 数组。前三个- 符号表示三个空的非发射帧。它们位于位置 0、1 和 2。它们在两个数组中的任何一个中都没有表示。

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

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

【讨论】:

  • 感谢这样的细节
  • 我会推荐使用rx-sandbox,我写了一篇关于它的文章:mokkapps.de/blog/…
  • @Mokkapps 我刚看到你的评论,我会检查谢谢
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 2020-01-09
  • 2017-04-10
  • 2020-10-04
  • 2020-10-08
  • 1970-01-01
  • 2017-10-31
  • 2021-10-25
相关资源
最近更新 更多