J'utilise moment.js pour faire la plupart de ma logique de date dans un fichier d'aide pour mes composants React mais je n'ai pas été en mesure de comprendre comment simuler une date dans Jest a la sinon.useFakeTimers()
.
Les documents Jest ne parlent que des fonctions de minuterie telles que setTimeout
, setInterval
etc., mais n'aident pas à définir une date et à vérifier ensuite 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 en utilisant Jest:
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 réussissent car j'utilise moment et mes fonctions utilisent moment mais cela semble un peu instable et j'aimerais fixer la date à une heure fixe pour les tests.
Une idée sur la façon dont cela pourrait être accompli?
Date
similairesvalueOf()
.Puisque momentjs utilise en
Date
interne, vous pouvez simplement écraser laDate.now
fonction pour toujours renvoyer le même moment.ou
la source
Date.now = jest.fn(() => new Date(Date.UTC(2017, 0, 1)).valueOf());
Date.now = jest.fn(() => +new Date('2017-01-01');
Date.now = jest.fn(() => Date.parse('2017-02-14))
jest.spyOn fonctionne pour le temps de verrouillage:
la source
dateNowSpy
variable, et lemockReset()
est redondant selon jestjs.io/docs/en/mock-function-api.html#mockfnmockrestore . Dans leafterAll
, vous pouvez simplement faireDate.now.mockRestore()
Date.now.mockRestore();
donne une propriété 'mockRestore' n'existe pas sur le type '() => number' errorjest-date-mock est un module javascript complet écrit par moi, et il est utilisé pour tester Date sur jest.
Utilisez la seule API 3 pour les cas de test.
la source
Pour ceux qui souhaitent simuler des méthodes sur un nouvel objet Date, vous pouvez effectuer les opérations suivantes:
la source
Toutes les réponses basées uniquement sur le simulacre de
Date.now()
ne fonctionneront pas partout puisque certains packages (par exemplemoment.js
) l'utilisent à lanew Date()
place.Dans ce contexte, la réponse basée sur
MockDate
est, je pense, la seule vraiment correcte. Si vous ne souhaitez pas utiliser de package externe, vous pouvez écrire directement dans votrebeforeAll
:la source
Je voudrais proposer des approches alternatives.
Si vous avez besoin de stub
format()
(qui peut dépendre de la locale et du fuseau horaire!)Si vous avez seulement besoin de stub
moment()
:En ce qui concerne le test de la
isDateToday
fonction ci-dessus, je pense que le moyen le plus simple serait de ne pas se moquermoment
du toutla source
TypeError: moment.mockReturnValue is not a function
jest.mock("moment")
au même niveau que vos déclarations d'importation? Sinon, vous êtes invités à le voir en action dans ce projetC'est ainsi que je me suis moqué de ma
Date.now()
méthode pour fixer l'année 2010 à mon testla source
Voici quelques méthodes lisibles pour différents cas d'utilisation. Je préfère utiliser des espions plutôt que d'enregistrer des références aux objets d'origine, qui peuvent être accidentellement écrasés dans un autre code.
Moquerie ponctuelle
Quelques tests
la source
Depuis Jest 26, cela peut être réalisé en utilisant de faux minuteries "modernes" sans avoir besoin d'installer de modules tiers: https://jestjs.io/blog/2020/05/05/jest-26#new-fake-timers
la source
J'aimerais utiliser Manual Mocks, afin qu'il puisse être utilisé dans tous les tests.
la source
L'objectif est de simuler la nouvelle Date () avec une date fixe partout où elle est utilisée lors du rendu du composant à des fins de test. L'utilisation de bibliothèques sera une surcharge si la seule chose que vous voulez est de vous moquer de new Date () fn.
L'idée est de stocker la date globale dans une variable temporaire, de simuler le dae global, puis après l'utilisation, de réaffecter la température à la date globale.
la source
Je voulais juste intervenir ici car aucune réponse ne résout le problème si vous souhaitez vous moquer de l'
Date
objet dans une suite spécifique uniquement.Vous pouvez vous en moquer en utilisant les méthodes de configuration et de démontage pour chaque suite, jest docs
J'espère que cela t'aides!
la source
Vous pouvez utiliser date-faker . Permet de modifier la date actuelle de manière relative:
la source