匹配的momentJS对象在茉莉花测试中不相等

时间:2017-05-13 21:02:43

标签: angular typescript jasmine momentjs karma-jasmine

我有一套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(

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这里的问题是你要比较两个不同的指针而不是两个不同的值。

在这种情况下我通常做的是在期望之前创建对象......

let date = moment('2017-01-01'); expect(date).toEqual(date);

如果您可以控制最终将与toHaveBeenCalledWith()一起使用的对象,则可以修改代码,以便比较指针。

否则,您可能必须进入低级别并获取使用calls.argsFor(index)传递的参数,并将其与您通常所做的格式()进行比较。

答案 1 :(得分:0)

您可以使用jasmine.objectContaining测试部分对象的相等性。正如@Dave Bush指出的那样,您需要手动检查时刻对象。您可以使用jasmine custom matchermoment().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);
    });

});

Run on JSFiddle

有关自定义匹配器的更多信息,我建议@boriscoder使用this article