Comment définir une date fictive en plaisantant?

j'utilise le moment.js pour faire la plupart de mes logique de date dans un fichier de helper pour mon Réagir les composants, mais je n'ai pas été en mesure de comprendre comment simuler une date dans la Plaisanterie à la sinon.useFakeTimers ().

Les Docs Jest ne parlent que des fonctions de minuterie comme setTimeout, setInveral etc mais n'aident pas à définir une date et ensuite vérifier que mes fonctions de date font ce qu'elles sont censées faire.

<!-Voici quelques-uns de mes fichiers JS:

var moment = require('moment');

var DateHelper = {

  DATE_FORMAT: 'MMMM D',
  API_DATE_FORMAT: 'YYYY-MM-DD',

  formatDate: function(date) {
    return date.format(this.DATE_FORMAT);
  },

  isDateToday: function(date) {
    return this.formatDate(date) === this.formatDate(moment());
  }
};

module.exports = DateHelper;

et voici ce que j'ai mis en place à l'aide de la Plaisanterie:

jest.dontMock('../../../dashboard/calendar/date-helper')
    .dontMock('moment');

describe('DateHelper', function() {
  var DateHelper = require('../../../dashboard/calendar/date-helper'),
      moment = require('moment'),
      DATE_FORMAT = 'MMMM D';

  describe('formatDate', function() {

    it('should return the date formatted as DATE_FORMAT', function() {
      var unformattedDate = moment('2014-05-12T00:00:00.000Z'),
          formattedDate = DateHelper.formatDate(unformattedDate);

      expect(formattedDate).toEqual('May 12');
    });

  });

  describe('isDateToday', function() {

    it('should return true if the passed in date is today', function() {
      var today = moment();

      expect(DateHelper.isDateToday(today)).toEqual(true);
    });

  });

});

maintenant ces tests passent parce que j'utilise moment et mes fonctions utilisent moment mais il semble un peu instable et je voudrais mettre la date à une heure fixe pour les tests.

Aucune idée sur comment cela pourrait être accompli?

38
demandé sur alengel 2015-04-18 19:03:32

5 réponses

MockDate peut être utilisé dans les tests de plaisanterie pour changer ce que new Date() renvoie:

var MockDate = require('mockdate');
// I use a timestamp to make sure the date stays fixed to the ms
MockDate.set(1434319925275);
// test code here
// reset to native Date()
MockDate.reset();
30
répondu eadmundo 2015-06-14 22:23:41

Depuis momentjs utilise Date intérieurement, vous pouvez juste écraser le Date.now fonction pour toujours retourner le même moment.

Date.now = jest.fn(() => 1487076708000) //14.02.2017
60
répondu stereodenis 2017-07-26 15:08:22

jest.spyOn fonctionne pour le temps de verrouillage:

let dateNowSpy;

beforeAll(() => {
    // Lock Time
    dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1487076708000);
});

afterAll(() => {
    // Unlock Time
    dateNowSpy.mockReset();
    dateNowSpy.mockRestore();
});
27
répondu Tim Santeford 2017-12-12 20:45:46

jest-date-mock est utilisé pour tester la Date avec jest.

import { advanceBy, advanceTo } from 'jest-date-mock';

test('usage', () => {
  advanceTo(new Date(2018, 5, 27, 0, 0, 0)); // reset to date time.

  const now = Date.now();

  advanceBy(3000); // advance time 3 seconds
  expect(+new Date() - now).toBe(3000);

  advanceBy(-1000); // advance time -1 second
  expect(+new Date() - now).toBe(2000);

  clear();
  Date.now(); // will got current timestamp
});

Utilisez la seule api pour les cas de test.

  • advanceBy(ms): l'avance de la date d'horodatage par ms.
  • advanceTo([timestamp]): date de réinitialisation d'horodatage par défaut à 0.
  • clear(): coupez le système simulé.
1
répondu atool 2018-06-05 06:36:48

Tous la réponse repose uniquement sur la maquette de Date.now() ne fonctionnera pas partout depuis quelques paquets (par exemple moment.js) utiliser new Date() à la place.

Dans ce contexte, la réponse repose sur MockDate c'est que je pense que la seule vraiment correctes. Si vous ne voulez pas utiliser un paquet externe, vous pouvez écrire directement dans votre beforeAll:

  const DATE_TO_USE = new Date('2017-02-02T12:54:59.218Z');
  // eslint-disable-next-line no-underscore-dangle
  const _Date = Date;
  const MockDate = (...args) => {
    switch (args.length) {
      case 0:
        return DATE_TO_USE;
      default:
        return new _Date(...args);
    }
  };
  MockDate.UTC = _Date.UTC;
  MockDate.now = () => DATE_TO_USE.getTime();
  MockDate.parse = _Date.parse;
  MockDate.toString = _Date.toString;
  MockDate.prototype = _Date.prototype;
  global.Date = MockDate;
0
répondu clemlaflemme 2018-03-05 20:23:00