web-dev-qa-db-fra.com

Jasmine date moqueuse avec moment.js

J'utilise moment.js pour la date et l'heure dans mon application, mais il semble que cela ne fonctionne pas bien avec les capacités moqueuses de Jasmine. J'ai mis en place une suite de tests ci-dessous qui montre mon problème:

jasmine.clock().mockDate ne semble pas fonctionner pour le moment, alors que cela fonctionne bien pour 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());
    });
});

Pourquoi Date fonctionne-t-il comme prévu alors que moment ne fonctionne pas? moment n'utilise-t-il pas Date sous le capot?

Quelle est la bonne façon de se moquer de moment en utilisant Jasmine?

14
jacwah

jasmine.clock().mockDate s'attend à Date en entrée. Date et moment ne sont pas totalement compatibles. Si vous fournissez la date à simuler dans la spécification elle-même, vous pouvez simplement utiliser Date à la place.

Si votre code génère un moment que vous souhaitez simuler, ou si vous préférez utiliser l'API Moment, consultez moment.toDate() . Cette méthode retourne l'objet Date sauvegardant un moment.

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());
});
27
jacwah