Дата жасмина, насмешливая с 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());
});
Ответ 2
Проверьте, как фиктивные моменты сами себя устраивают в собственном тестовом наборе:https://github.com/moment/moment/blob/2e2a5b35439665d4b0200143d808a7c26d6cd30f/src/test/moment/now.js#L15
Ответ 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>