【问题标题】:Jasmine: How to unit test my date filters that uses moment.js?Jasmine:如何对使用 moment.js 的日期过滤器进行单元测试?
【发布时间】:2015-12-07 22:45:24
【问题描述】:

我想为使用moment.js 创建的日期过滤器编写单元测试。

例如

app.filter('timeFormat', function () {
    return function (date) {
        return moment(date).format("LT");
    };
});

测试上述过滤器的最佳方法是什么?

下面的测试看起来不错吗?还是我必须模拟时刻功能?如果是这样,我们如何才能做到这一点?

describe('Filter: timeFormat', function () {

    'use strict';

    var $filter;

    beforeEach(module('someApp'));

    beforeEach(inject(function (_$filter_) {
        $filter = _$filter_;
    }));

    it('should return time in localized time format', function () {
        var filterTime = $filter('timeFormat');

        var date = new Date();
        var expectedTime = "5:46 AM";

        date.setHours(5);
        date.setMinutes(46);

        expect(filterTime(date)).toEqual(expectedTime);

        expectedTime = "2:34 PM";
        date.setHours(14);
        date.setMinutes(34);

        expect(filterTime(date)).toEqual(expectedTime);

        expectedTime = "12:59 PM";
        date.setHours(12);
        date.setMinutes(59);

        expect(filterTime(date)).toEqual(expectedTime);

        expectedTime = "11:59 PM";
        date.setHours(23);
        date.setMinutes(59);

        expect(filterTime(date)).toEqual(expectedTime);
    });
});

【问题讨论】:

  • 您的测试对我来说看起来不错。我唯一不喜欢的是你在一个测试中有多个断言。

标签: angularjs unit-testing jasmine momentjs


【解决方案1】:

有一个常见的规则是you should not mock what you do not own。如果你模拟 momentjs 函数,将来可能会遇到问题。

想象一下,在未来的某个版本中,momentjs 会改变 LT 格式的含义(值得怀疑,但您可以看到问题所在)。升级到新版本后,如果您在单元测试中使用 momentjs 实现,您的测试将检测到这种回归。相反,如果您模拟它并记录类似 return "5:46 AM" if moment is called with "LT" 之类的内容,那么您的测试将是绿色的,尽管生产代码由于以下原因而无法工作momentjs 升级。

但是,如果您的问题是关于一些不同的事情并且这只是一个最小的示例,您可以(但您不应该)使用callFake 模拟时刻:

spyOn(window, 'moment').and.callFake(function (date) {
  return {
    format: function (format) { /* your format implementation */ }
  };
});

【讨论】:

  • 我喜欢你关于为什么不应该嘲笑外部库的观点。
【解决方案2】:

你可以尝试如下:

var expectedTime = '5:46 AM';
var momentTime = moment(expectedTime);
date.setHours(5);
date.setMinutes(46);
expect(filterTime(date)).toEqual(momentTime._i);

其中 _i 是 momentTime 对象中的时间。

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多