Дата жасмина, насмешливая с moment.js

Я использую 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 под капотом?

Каков правильный способ фальсификации moment с помощью Jasmine?

Ответ 1

jasmine.clock().mockDate ожидает ввода Date. Date и moment не полностью совместимы. Если вы укажете дату, которая будет посмеяться в самой спецификации, вы можете просто использовать вместо нее 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());
});

Ответ 3

Я пытался найти альтернативу 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>