2015-10-27 14 views
7

Sto usando moment.js per data/ora nella mia applicazione, ma sembra che non funzioni bene con le capacità di derisione di Jasmine. Ho messo insieme una suite di test che mostra il mio numero:Jasmine date mocking with moment.js

jasmine.clock().mockDate non sembra funzionare per il momento, mentre funziona bene per 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()); 
    }); 
}); 

Perché il Date lavoro come previsto, mentre moment non lo fa? Non è moment usando Date sotto il cofano?

Qual è il modo corretto di simulare moment utilizzando Jasmine?

risposta

19

jasmine.clock().mockDate prevede Date come input. Date e moment non sono completamente compatibili. Se si fornisce la data da prendere in giro nella specifica stessa, è possibile utilizzare semplicemente lo Date.

Se il codice genera un momento che si vuole prendere in giro, o si preferisce utilizzare l'API momento, dare un'occhiata a moment.toDate(). Questo metodo restituisce il backup dell'oggetto Date un momento.

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

Nota importante: non dimenticare di reimpostare la data del mock dopo il test! AFAIK, chiamando 'jasmine.clock(). MockDate (..)' è un'azione globale, quindi sarebbe una buona idea impostarlo (e annullarlo) in un blocco 'beforeEach' separato. Quindi basta cancellarlo in seguito usando 'jasmine.clock(). Uninstall()' in un blocco 'afterEach'. –