Jasmine .toHaveBeenCalledWith(aDate)无法正常工作

时间:2014-12-04 19:12:36

标签: testing jasmine

我正在继承一些代码,我还有两个仍然失败的测试,不确定它们是否曾经存在,或者是否因为我有不同版本的Jasmine(它们是2.0之前的版本)

失败的测试在beforeEach

中有这个间谍设置
spyOn(datacontext, 'getImportLogForDate').and.callThrough();

然后在测试中

controller.DepositDate = new Date();
controller.PerformActionThatCallsGetImportLogForDate();
expect(context.getImportLogForDate).toHaveBeenCalledWith('1', controller.DepositDate);

由此产生的错误令人困惑,因为它们是相同的

预期间谍getImportLogForDate已被 ['1',日期(2014年12月4日星期四格林威治标准时间06:00:51 GMT-0600(中央标准时间))] 调用,但实际通话时间 ['1',日期(2014年12月4日星期四13:00:51 GMT-0600(中央标准时间))]

我是否可以使用日期验证功能?

2 个答案:

答案 0 :(得分:3)

PerformActionThatCallsGetImportLogForDate对日期对象做什么? Jasmine按照毫秒值对日期对象进行比较,因此即使它们在1ms内关闭,它们也不会相等,但是您只是在读取控制台输出时看不到详细程度。

或者,您还有其他2个选项。

只测试日期对象被用作第二个参数。

expect(context.getImportLogForDate)
    .toHaveBeenCalledWith('1', jasmine.any(Date));

测试该日期值,但在toHaveBeenCalledWith之外,如果该匹配器存在某些特定的怪异。

expect(context.getImportLogForDate.calls.mostRecent().args[0])
    .toEqual('1');
expect(context.getImportLogForDate.calls.mostRecent().args[1])
    .toEqual(controller.DepositDate);

答案 1 :(得分:1)

我发现,将toHaveBeenCalledWith用于特定的Date时,jasmine.objectContaining很有效。

it('#userChangedMonth calls fetchData with end of month', () => {
    spyOn(component, 'fetchData').and.returnValue(true);
    const calendarChangedTo = new Date('2018-10-10 00:00:00');
    const endOfMonth = new Date('2018-10-31 23:59:59');
    component.userChangedMonth(calendarChangedTo);
    expect(component.fetchData).toHaveBeenCalledWith(jasmine.objectContaining(endOfMonth));
  });