Saya menggunakan moment.js untuk melakukan sebagian besar logika tanggal saya di file helper untuk komponen React saya, tetapi saya belum dapat mengetahui cara membuat tiruan kencan di Jest a la sinon.useFakeTimers()
.
Dokumen Jest hanya berbicara tentang fungsi pengatur waktu seperti setTimeout
, setInterval
dll tetapi tidak membantu dengan mengatur tanggal dan kemudian memeriksa bahwa fungsi tanggal saya melakukan apa yang seharusnya mereka lakukan.
Berikut beberapa file JS saya:
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;
dan inilah yang telah saya siapkan menggunakan 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);
});
});
});
Sekarang tes ini lulus karena saya menggunakan momen dan fungsi saya menggunakan momen tetapi tampaknya agak tidak stabil dan saya ingin menyetel tanggal ke waktu tetap untuk pengujian.
Ada gagasan tentang bagaimana itu bisa dicapai?
Date
suka lainnyavalueOf()
.Karena momentjs menggunakan secara
Date
internal, Anda bisa menimpaDate.now
fungsi tersebut untuk selalu mengembalikan momen yang sama.atau
sumber
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 berfungsi untuk mengunci waktu:
sumber
dateNowSpy
variabel, danmockReset()
itu mubazir menurut jestjs.io/docs/en/mock-function-api.html#mockfnmockrestore . DiafterAll
, Anda cukup melakukannyaDate.now.mockRestore()
Date.now.mockRestore();
memberikan Properti 'mockRestore' tidak ada pada tipe '() => nomor' kesalahanjest-date-mock adalah modul javascript lengkap yang saya buat, dan digunakan untuk menguji Date on jest.
Gunakan satu-satunya api 3 untuk kasus uji.
sumber
Bagi mereka yang ingin meniru metode pada objek Tanggal baru, Anda dapat melakukan hal berikut:
sumber
Semua jawaban hanya berdasarkan tiruan
Date.now()
tidak akan berfungsi di mana-mana karena beberapa paket (misalnyamoment.js
) digunakannew Date()
sebagai gantinya.Dalam konteks ini jawaban berdasarkan
MockDate
saya pikir satu-satunya yang benar. Jika Anda tidak ingin menggunakan paket eksternal, Anda dapat menulis langsung dibeforeAll
:sumber
Saya ingin menawarkan beberapa pendekatan alternatif.
Jika Anda perlu stub
format()
(yang dapat bergantung pada lokal dan zona waktu!)Jika Anda hanya perlu stub
moment()
:Mengenai pengujian
isDateToday
fungsi di atas, saya yakin cara yang paling sederhana adalah dengan tidak mengejekmoment
sama sekalisumber
TypeError: moment.mockReturnValue is not a function
jest.mock("moment")
pada tingkat yang sama dengan pernyataan impor Anda? Jika tidak, Anda dipersilakan untuk melihatnya beraksi dalam proyek iniBeginilah cara saya mengejek
Date.now()
metode saya untuk menyetel tahun ke 2010 untuk pengujian sayasumber
Berikut beberapa cara yang dapat dibaca untuk berbagai kasus penggunaan. Saya lebih suka menggunakan mata-mata daripada menyimpan referensi ke objek asli, yang secara tidak sengaja dapat ditimpa dalam beberapa kode lain.
Ejekan satu kali
Beberapa tes
sumber
Mulai Jest 26, hal ini dapat dilakukan dengan menggunakan timer palsu "modern" tanpa perlu menginstal modul pihak ketiga: https://jestjs.io/blog/2020/05/05/jest-26#new-fake-timers
sumber
Saya ingin menggunakan Manual Mocks, sehingga dapat digunakan di semua pengujian.
sumber
Tujuannya adalah untuk meniru Tanggal baru () dengan tanggal tetap di mana pun itu digunakan selama rendering komponen untuk tujuan pengujian. Menggunakan perpustakaan akan menjadi overhead jika satu-satunya hal yang Anda inginkan adalah meniru Date () fn baru.
Ide adalah untuk menyimpan tanggal global ke variabel temp, tiruan dae global dan kemudian setelah penggunaan menetapkan ulang temp ke tanggal global.
sumber
Saya hanya ingin berpadu di sini karena tidak ada jawaban yang mengatasi masalah jika Anda ingin mengejek
Date
objek hanya dalam rangkaian tertentu.Anda dapat memalsukannya menggunakan metode penyiapan dan pembongkaran untuk setiap suite, dokumen bercanda
Semoga ini membantu!
sumber
Anda dapat menggunakan pembuat tanggal . Memungkinkan Anda mengubah tanggal saat ini secara relatif:
sumber