Ich verwende moment.js, um den größten Teil meiner Datumslogik in einer Hilfsdatei für meine React-Komponenten auszuführen, aber ich konnte nicht herausfinden, wie ich ein Datum in Jest a la verspotten kann sinon.useFakeTimers().
Die Jest-Dokumentation spricht nur über Timer-Funktionen wie setTimeout, setInterval usw. helfen aber nicht beim Einstellen eines Datums und dann beim Überprüfen, ob meine Datumsfunktionen das tun, was sie tun sollen.
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);
});
});
});
Jetzt werden diese Tests bestanden, weil ich Moment verwende und meine Funktionen Moment verwenden, aber es scheint ein bisschen instabil zu sein, und ich möchte das Datum auf eine feste Zeit für die Tests festlegen.
Irgendeine Idee, wie das bewerkstelligt werden könnte?
Können Sie bitte eine andere Antwort auswählen, da Jest jetzt einen eingebauten Datumsspott hat?
BEARBEITEN: Ab Jest 27 sind moderne gefälschte Timer die Standardeinstellung, sodass Sie das Argument fallen lassen können useFakeTimers.
danke Mann, ich denke, das sollte die Lösung dieser Frage sein.
– Shahzad
17. August 2020 um 7:26 Uhr
Dies ist definitiv die einfachste Lösung für das Problem
– markyph
14. Oktober 2020 um 13:25 Uhr
Erwähnenswert ist auch die .useFakeTimers('modern') bit kann aus einer globalen Konfigurationsdatei aufgerufen werden (wie z setupTests.js). Damit in einfach entfernt werden kann, ist dies die Standardoption. Aus demselben Link: In Jest 27 we will swap the default to the new "modern".
– Jose Kilo
10. November 2020 um 15:56 Uhr
Du möchtest vielleicht jest.useRealTimers() nachdem Sie mit den gefälschten Timern fertig sind.
– Aakash
21. November 2020 um 9:13 Uhr
Diese Lösung funktioniert bei mir nur, wenn ich anrufe jest.setSystemTime() im Testaufbau; wenn ich es anrufe beforeAll meiner Testsuite wird es ignoriert. Überprüfen Sie das von mir erstellte Repo, um dies zu testen github.com/dariospadoni/jestFakeTimersMock/blob/main/src/…
– Dario
23. Februar 2021 um 12:00 Uhr
stereodenis
Da verwendet momentjs Date intern kannst du die einfach überschreiben Date.now Funktion, um immer denselben Moment zurückzugeben.
Date.now = jest.fn(() => new Date(Date.UTC(2017, 1, 14)).valueOf())
Hier ist eine etwas hübschere Methode zum Festlegen des tatsächlichen Datums, das zurückgegeben wird: Date.now = jest.fn(() => new Date(Date.UTC(2017, 0, 1)).valueOf());
– entwickeln
26. Juli 2017 um 16:10 Uhr
Oder noch ein bisschen hübscher:Date.now = jest.fn(() => +new Date('2017-01-01');
Das ist großartig, also brauchen Sie keine zusätzlichen Bibliotheken. Dies funktioniert jedoch nur dann wirklich, wenn Sie statische Date-Methoden verwenden (die nicht viele sind).
– hellatan
12. Dezember 2018 um 2:09 Uhr
@Jimmy Date.now.mockRestore(); gibt ein Die Eigenschaft „mockRestore“ existiert nicht für den Typ „() => Zahl“. Error
– Marco Lacković
20. Februar 2019 um 10:28 Uhr
@Marco es sollte jest.spyOn(Date, “now”).mockRestore(); sein;
– sab
17. April 2019 um 9:32 Uhr
MockDate In Scherztests kann man was ändern new Date() kehrt zurück:
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();
RobotEyes
Für diejenigen, die Methoden auf a verspotten wollen new Date Objekt können Sie Folgendes tun:
Danke, das hat gerade das Problem behoben, das ich hatte.
– Grayson Langford
4. Mai 2020 um 20:03 Uhr
Jest-Date-Mock ist ein komplettes Javascript-Modul, das von mir geschrieben wurde, und es wird verwendet, um Date im Scherz zu testen.
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
});
Verwenden Sie die einzigen 3 APIs für Testfälle.
advanceBy(ms): Zeitstempel des Datums um ms vorrücken.
vorauszu([timestamp]): Datum auf Zeitstempel zurücksetzen, Standard auf 0.
clear(): Fährt das Mock-System herunter.
Danke, das hat gerade das Problem behoben, das ich hatte.
– Grayson Langford
4. Mai 2020 um 20:03 Uhr
mattdlockyer
Hier sind ein paar lesbare Möglichkeiten für verschiedene Anwendungsfälle. Ich ziehe es vor, Spione zu verwenden, anstatt Verweise auf die ursprünglichen Objekte zu speichern, die versehentlich in anderem Code überschrieben werden können.
Einmaliger Spott
jest
.spyOn(global.Date, 'now')
.mockImplementationOnce(() => Date.parse('2020-02-14'));
Ein paar Tests
let dateSpy;
beforeAll(() => {
dateSpy = jest
.spyOn(global.Date, 'now')
.mockImplementation(() => Date.parse('2020-02-14'));
});
afterAll(() => {
dateSpy.mockRestore();
});
13090200cookie-checkWie lege ich ein Scheindatum in Jest fest?yes
Können Sie bitte eine andere Antwort auswählen, da Jest jetzt einen eingebauten Datumsspott hat?
– Mikemaccana
5. November 2021 um 16:08 Uhr