茉莉花约会与moment.js嘲笑

时间:2015-10-27 23:28:26

标签: javascript jasmine momentjs

我在我的应用程序中使用了moment.js作为日期/时间,但似乎它与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的正确方法是什么?

4 个答案:

答案 0 :(得分:30)

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

如果您的代码生成了您想要模拟的片刻,或者您更愿意使用片刻API,请查看moment.toDate()。此方法返回支持片刻的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());
});

答案 1 :(得分:0)

了解一下瞬间模拟如何在自己的测试套件中进行自我约会: https://github.com/moment/moment/blob/2e2a5b35439665d4b0200143d808a7c26d6cd30f/src/test/moment/now.js#L15

答案 2 :(得分:0)

我试图寻找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

答案 3 :(得分:0)

  1. 将时刻导入规范文件

    import * as moment from 'moment';

  2. 期待您的测试用例时刻

    const stringDate = moment.utc(date).format(stringFormat); 期望(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');
  });

});