我有一套Jasmine测试作为基于angular-cli的项目的一部分。我的一个断言是:
expect(dispatchSpy).toHaveBeenCalledWith({
type: 'SET_RANGE', payload: { value: 'Weekly', start: moment('2017-04-24'), end: moment() }
});
但是,我收到以下错误。
使用[Object({type:'SET_RANGE',有效负载:对象({值:'周刊',开始:2017年4月24日星期一00:00:00 GMT + 0100,结束:周六)调用预期的间谍调度2017年4月29日00:00:00 GMT + 0100})})]但实际调用是[Object({type:'SET_RANGE',payload:Object({value:'Weekly',start:Mon Apr 24 2017 00:00 :00 GMT + 0100,结束:2017年4月29日星期六00:00:00 GMT + 0100})})]
显然这些显示相同,但我在其他地方遇到过这个问题,其中momentJS对象的某些属性不匹配。所以我通常会使用:
expect(moment('2017-01-01').format()).toEqual(moment('2017-01-01').format())
但是在使用format()
).toHaveBeenCalledWith(
位
有什么建议吗?
答案 0 :(得分:0)
这里的问题是你要比较两个不同的指针而不是两个不同的值。
在这种情况下我通常做的是在期望之前创建对象......
let date = moment('2017-01-01');
expect(date).toEqual(date);
如果您可以控制最终将与toHaveBeenCalledWith()
一起使用的对象,则可以修改代码,以便比较指针。
否则,您可能必须进入低级别并获取使用calls.argsFor(index)传递的参数,并将其与您通常所做的格式()进行比较。
答案 1 :(得分:0)
您可以使用jasmine.objectContaining
测试部分对象的相等性。正如@Dave Bush指出的那样,您需要手动检查时刻对象。您可以使用jasmine custom matcher和moment().isSame
创建自定义匹配器。
这是一个使用Jasmine 2编写的测试示例:
describe('Moment containing object', function () {
beforeEach(function () {
jasmine.addMatchers({
toBeEqualMoment: function () {
return {
compare: function (actual, expected) {
let result = {};
result.pass = actual.isSame(expected);
return result;
}
};
}
});
});
it('is equal to moment containg object', function () {
let input = {type: 'SET_RANGE', payload: { value: 'Weekly', start: moment('2017-04-24'), end: moment() }};
let fooSpy = jasmine.createSpy('foo');
fooSpy(input);
let joc = jasmine.objectContaining;
expect(fooSpy).toHaveBeenCalledWith(joc({type: 'SET_RANGE', payload: joc({value: 'Weekly'})}));
let spyCallParam = fooSpy.calls.mostRecent().args[0];
expect(spyCallParam.payload.start).toBeEqualMoment(input.payload.start);
expect(spyCallParam.payload.end).toBeEqualMoment(input.payload.end);
});
});
有关自定义匹配器的更多信息,我建议@boriscoder使用this article。