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?
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();
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
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();
});
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é.
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;