2015-10-27 2 views
7

Я использую moment.js для date/time в своем приложении, но похоже, что он не играет хорошо с издевательскими возможностями Жасмина. Я собрал набор тестов ниже, который показывает мою проблему:Jasmine date mocking with moment.js

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 с использованием жасмина?

ответ

19

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

Важное примечание - не забудьте сбросить фальшивую дату после теста! AFAIK, вызывая 'jasmine.clock(). MockDate (..)' является глобальным действием, поэтому было бы неплохо установить (и отключить) его в отдельном блоке 'beforeEach'. Затем просто очистите его позже, используя 'jasmine.clock(). Uninstall()' в блоке 'afterEach'. –