Jest 预期和接收相同

Ste*_*hen 4 jestjs stenciljs

当两者看起来完全相同时,Jest 会认为这不完全相同吗?

所以这是我用来进行测试的代码,它基本上只是一个调用事件发射器的函数,在事件发射器中,如果日期无效,我会按原样设置:

  const datepickerComponent: Datepicker = new Datepicker();

  const mockEvent = {
    target: {
      classList: {
        remove: jest.fn(),
        add: jest.fn(),
      },
      value: '01-01-197',
    },
  } as unknown as InputEvent;

  datepickerComponent.onInput(mockEvent);

  const emitMock: jest.Mock = jest.fn();
  datepickerComponent.dsdDatepickerInputChange = { emit: emitMock } as unknown as EventEmitter<dsdDatepickerInputChangeEvent>;

  // when
  datepickerComponent.onInput(mockEvent);

  const dateValue = new Date('197-01-01T00:00:00');

  // then
  expect(emitMock).toHaveBeenCalledWith({ value: '197-01-01', valueAsDate: dateValue });
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ovi*_*nas 6

您观察到此错误的原因Date { NaN }是因为虽然值看起来相同,但它们实际上引用了不同的对象实例,并且无法进一步遍历以获得相等性,因此实际错误应该如下:

Expected: {"value": "197-01-01", "valueAsDate": Date { NaN }}
Received: serializes to the same string
Run Code Online (Sandbox Code Playgroud)

(要重现此错误 - 使用创建两个新日期new Date('197-01-01T00:00:00')并将它们传递到.equals()

要克服此错误,您所需要做的就是将.toHaveBeenCalledWith测试重构为以下内容:

const calledWithArg = emitMock.mock.calls[0][0];
expect(JSON.stringify(calledWithArg)).toEqual(JSON.stringify({ value: '197-01-01', valueAsDate: dateValue }));
Run Code Online (Sandbox Code Playgroud)

不起作用的原因.toHaveBeenCalledWith是它不允许我们在比较之前重塑参数对象(在我们的例子中,我们需要将其字符串化),因此我们可以选择使用 via 提取模拟调用的参数.mock.calls[0][0],将其字符串化并然后将其与预期对象的字符串化版本进行比较。