我正在继承一些代码,我还有两个仍然失败的测试,不确定它们是否曾经存在,或者是否因为我有不同版本的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(中央标准时间))] 。
我是否可以使用日期验证功能?
答案 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));
});