首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在茉莉花测试中匹配momentJS对象不“相等”

在茉莉花测试中匹配momentJS对象不“相等”
EN

Stack Overflow用户
提问于 2017-05-13 21:02:43
回答 2查看 2.5K关注 0票数 0

我有一套茉莉花测试,作为我的角cli项目的一部分。我的说法之一是:

代码语言:javascript
运行
复制
expect(dispatchSpy).toHaveBeenCalledWith({
  type: 'SET_RANGE', payload: { value: 'Weekly', start: moment('2017-04-24'), end: moment() }
});

但是,我得到以下错误。

预期间谍调度将被对象调用({ type:'SET_RANGE',有效载荷: Object({ value:‘were’,start: Mon 2017年4月24日00:00:00 GMT+0100,end: Sat Apr 2017年4月29日00:00:00 GMT+0100 }) ),但实际调用是对象({ type:'SET_RANGE',有效载荷: Object({ value:‘were’,start: Apr24 2017 00:00:00 GMT+0100,end: Sat 4月29日2017 :00:00 GMT+0100 }) })

显然,它们显示的是相同的,但是我在其他地方遇到了这个问题,在那里,momentJS对象的某些属性不匹配。所以我通常会用:

代码语言:javascript
运行
复制
expect(moment('2017-01-01').format()).toEqual(moment('2017-01-01').format())

但是我不能在使用format()时使用).toHaveBeenCalledWith(

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-13 22:15:55

您可以使用jasmine.objectContaining测试部分对象相等。正如戴夫布什(Dave)所指出的,你需要手动检查瞬间对象。您可以使用茉莉花习俗匹配器moment().isSame创建自定义匹配器。

下面是一个使用Jasmine 2编写的JavaScript测试示例:

代码语言:javascript
运行
复制
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);
    });

});

在JSFiddle上运行

有关自定义匹配器的更多信息,我推荐@boriscoder提供这篇文章

票数 2
EN

Stack Overflow用户

发布于 2017-05-13 21:23:42

这里的问题是,您正在比较两个不同的指针,而不是两个不同的值。

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

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

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

否则,您可能必须降低级别,获取使用calls.argsFor(索引)传递的参数,并像通常一样将其与格式()进行比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43957965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档