Ich verwende moment.js, um den größten Teil meiner Datumslogik in einer Hilfedatei 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-Dokumente sprechen nur über Timer-Funktionen wie setTimeout
, setInterval
etc , aber nicht Hilfe mit einem Datum festlegen und dann prüfen, ob meine Datumsfunktionen zu tun , was sie tun soll.
Hier sind einige meiner JS-Dateien:
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;
und hier ist, was ich mit Jest eingerichtet habe:
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 bestehen diese Tests, 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 einstellen.
Irgendeine Idee, wie das erreicht werden könnte?
Date
like verwendet habevalueOf()
.Da momentjs
Date
intern verwendet wird, können Sie dieDate.now
Funktion einfach überschreiben , um immer den gleichen Moment zurückzugeben.oder
quelle
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 funktioniert für die Sperrzeit :
quelle
dateNowSpy
Variable erforderlich , und diemockReset()
ist laut jestjs.io/docs/en/mock-function-api.html#mockfnmockrestore redundant . In derafterAll
können Sie einfach tunDate.now.mockRestore()
Date.now.mockRestore();
gibt eine Eigenschaft 'mockRestore' existiert nicht auf Typ '() => Nummer' Fehlerjest-date-mock ist ein vollständiges Javascript-Modul, das von mir geschrieben wurde und zum Testen von Date on jest verwendet wird.
Verwenden Sie die einzigen 3 APIs für Testfälle.
quelle
Für diejenigen, die Methoden für ein neues Date-Objekt verspotten möchten, können Sie Folgendes tun:
quelle
Alle Antworten, die nur auf dem Mock of basieren,
Date.now()
funktionieren nicht überall, da einige Pakete (zum Beispielmoment.js
)new Date()
stattdessen verwenden.In diesem Zusammenhang ist die Antwort, die darauf basiert,
MockDate
meiner Meinung nach die einzig wirklich richtige. Wenn Sie kein externes Paket verwenden möchten, können Sie direkt in Folgendes schreibenbeforeAll
:quelle
Ich möchte einige alternative Ansätze anbieten.
Wenn Sie stubben müssen
format()
(was vom Gebietsschema und der Zeitzone abhängig sein kann!)Wenn Sie nur stub
moment()
:In Bezug auf den Test für die
isDateToday
Funktion oben, glaube ich , die einfachste Art und Weise nicht zu spotten würdemoment
überhauptquelle
TypeError: moment.mockReturnValue is not a function
jest.mock("moment")
auf dem gleichen Niveau wie Ihre Importanweisungen? Ansonsten können Sie es gerne in Aktion in diesem Projekt sehenSo habe ich mich über meine
Date.now()
Methode lustig gemacht, das Jahr für meinen Test auf 2010 zu setzenquelle
Hier sind einige lesbare Möglichkeiten für verschiedene Anwendungsfälle. Ich bevorzuge die Verwendung von Spionen gegenüber dem Speichern von Verweisen auf die Originalobjekte, die versehentlich in einem anderen Code überschrieben werden können.
Einmalige Verspottung
Ein paar Tests
quelle
Ich möchte Manual Mocks verwenden, damit es in allen Tests verwendet werden kann.
quelle
Ziel ist es, neues Datum () mit einem festen Datum zu verspotten, wo immer es während des Renderns der Komponente zu Testzwecken verwendet wird. Die Verwendung von Bibliotheken ist ein Aufwand, wenn Sie nur das neue Date () fn verspotten möchten.
Die Idee ist, das globale Datum in einer temporären Variablen zu speichern, das globale Datum zu verspotten und dann nach der Verwendung die Temperatur dem globalen Datum neu zuzuweisen.
quelle
Ich wollte mich nur hier einschalten, da keine Antwort das Problem ansprach, wenn Sie sich über das lustig machen wollen
Date
Objekt nur in einer bestimmten Suite .Sie können ihn verspotten für jede Suite der Setup - und Teardown - Methoden verwenden, Scherz docs
Hoffe das hilft!
quelle
Sie können Date-Faker verwenden . Hiermit können Sie das aktuelle Datum relativ ändern:
quelle