茉莉花日期嘲笑 moment.js

Jasmine date mocking with moment.js

我在我的应用程序中将 moment.js 用于 date/time,但它似乎不能很好地与 Jasmine 的模拟功能配合使用。我在下面整理了一个测试套件来显示我的问题:

jasmine.clock().mockDate 似乎暂时不起作用,而 Date.

却可以正常工作
describe('Jasmine tests', function () {
    beforeEach(function() {
        jasmine.clock().install();
    });

    afterEach(function() {
        jasmine.clock().uninstall();
    });

    // Pass
    it('uses the mocked time with Date', function() {
        var today = new Date('2015-10-19');
        jasmine.clock().mockDate(today);
        expect(new Date().valueOf()).toEqual(today.valueOf());
    });


    // Fail
    it('uses the mocked time with moment', function() {
        var today = moment('2015-10-19');
        jasmine.clock().mockDate(today);

        expect(moment().valueOf()).toEqual(today.valueOf());
    });
});

为什么 Date 可以正常工作,而 moment 却没有? moment 不是在后台使用 Date 吗?

使用 Jasmine 模拟 moment 的正确方法是什么?

jasmine.clock().mockDate 期望 Date 作为输入。 Datemoment 不完全兼容。如果您在规范本身中提供了待模拟日期,您可以在那里简单地使用 Date

如果您的代码生成了您想要模拟的时刻,或者您更愿意使用该时刻 API,请查看 moment.toDate()。此方法returns Date 支持片刻的对象。

it('uses the mocked time with moment', function() {
    var today = moment('2015-10-19').toDate();
    jasmine.clock().mockDate(today);
    expect(moment().valueOf()).toEqual(today.valueOf());
});

看看 moment mock 如何在他们自己的测试套件中约会自己: https://github.com/moment/moment/blob/2e2a5b35439665d4b0200143d808a7c26d6cd30f/src/test/moment/now.js#L15

我试图找到 jasmine 甚至其他模拟框架的替代方案,以 避免依赖性

const currentToday = moment().toDate();
console.log(`currentToday:`, currentToday)

const newToday = moment('1980-01-01').toDate();
console.log(`newToday    :`, newToday);

Date.now = () => {
  return newToday
};

const fakedToday = moment().toDate();
console.log(`fakedToday  :`, fakedToday)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

currentToday: 2019-09-17T15:26:12.763Z
newToday    : 1980-01-01T00:00:00.000Z
fakedToday  : 1980-01-01T00:00:00.001Z
  1. 将力矩导入规范文件

    从 'moment' 导入 * 作为时刻;

  2. 期待您的测试用例

    const stringDate = moment.utc(date).format(stringFormat); expect(stringDate).toEqual('2021-05-23T08:00:00');

  3. 最终的规范文件如下所示

import { TestBed } from '@angular/core/testing';
import { convertDateToString, getDateDifferenceInHours, getDateIsoStringWithoutTimezone, getDateIsoStringWithTimezone, getDateWithoutTimezone } from './DateHelper';
import * as  moment from 'moment';
import * as DateHelper from '@shared/helper/DateHelper';

describe('DateHelper', () => {
  beforeEach(async () => {
    await TestBed.configureTestingModule({
    });
  });

  it('should convert date to string YYYY-MM-DD', () => {
    expect(convertDateToString(new Date('05-23-2021 12:00'), 'YYYY-MM-DD')).toEqual('2021-05-23');
  });

  it('should convert date to iso string without timezone', () => {
    expect(getDateIsoStringWithoutTimezone(new Date('05-23-2021 12:00'))).toEqual('2021-05-23T12:00:00.000Z');
  });

});