当两者看起来完全相同时,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)
您观察到此错误的原因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],将其字符串化并然后将其与预期对象的字符串化版本进行比较。
| 归档时间: |
|
| 查看次数: |
4737 次 |
| 最近记录: |