Chrono Mock
DilTürkçe

Bir Electron uygulamasında tarihi sahtelemek

Bunu aratın ve her yanıt kendi kodunuzu değiştirmekle ilgili - Date nesnesini mock’lamak, test çerçevenizin sahte zamanlayıcılarını kullanmak. Elinizde derlenmiş bir uygulama olduğunda bunların hiçbiri işe yaramaz. Bu, zaten sahip olduğunuz uygulamayı çalıştırır.

Enjeksiyon ona neden ulaşmaz

Bu kip belirli bir başarısızlık yüzünden vardır. Electron üzerine kurulu bir Pomodoro zamanlayıcısı x60 oturumunda çalıştırıldı ve geri sayımı hiç ilerlemedi. Uygulamanın paketini parçalara ayırmak iki bağımsız neden gösterdi ve hiçbirinin yerel tarafta bir çözümü yoktu:

  • Geri sayım bir saat okumuyordu. Bir Web Worker içinde çalışan, setInterval tarafından artırılan bir sayaçtı. Yakalanacak bir zaman çağrısı yoktu; çünkü uygulama saatin kaç olduğunu hiç sormuyordu.
  • O worker, yalıtılmış bir renderer sürecinde yaşar; dışarıdan enjekte edilen bir kitaplığın giremediği tam da o yer.

Dolayısıyla Windows tarafındaki mekanizma burada yardımcı olamaz ve çözüm, bunun yerine uygulamanın kendi JavaScript motoruyla konuşmaktır.

Bunun yerine ne olur

Uygulama bir hata ayıklama portu ve temiz, tek kullanımlık bir profille başlatılır ve kendi zaman API’leri DevTools protokolü üzerinden oturum saatine alınır - Date.now, new Date() oluşturucusu, performance.now, setTimeout ve setInterval.

Geçersiz kılma, uygulamanın açtığı her bağlama, Web Worker’ları dahil, yüklenir - zamanlayıcının genellikle yaşadığı ve yerel enjeksiyonun asla ulaşamayacağı tek yer burasıdır.

Onu nasıl yönettiğiniz hakkında hiçbir şey değişmez. Aynı komut, aynı pencere, iki saatin ve kararın bulunduğu aynı oturum paneli.

# Yerel bir uygulamayla aynı komut - kip otomatik algılanır
chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60

Başlamadan önce bilmeye değer iki sınırlama

Başlatma müdahaleci ve bunu bilerek yüksek sesle söylüyor.

Uygulama açık bir uzak hata ayıklama portu ve %TEMP% altında yeni, yalıtılmış bir profille başlatılır - gerçek profilinizde çalışmaz ve sistem tepsinizde zaten bulunan kopya da değildir. Profil oturum bittiğinde silinir ve silinememişse oturum özeti bunu sessizce geride bırakmak yerine söyler.

Kendi --user-data-dir ya da --remote-debugging-port değerinizi iletmek geçersiz kılınmak yerine reddedilir; çünkü bariz kaza - oturumu gerçek tarayıcı profilinize yöneltmek - izin vermeye değmeyecek bir şeydir.

Sayfalar oturumun saat dilimini okur.

Her sayfa ve worker, yaz saati uygulaması olmayan sabit bir fark olan oturum saat dilimine alınır ve okuduğu farkı denetler, bu yüzden başka bir dilimi okuyan sayfa raporlanır. İki sınır var: Intl bu dilimi bir şehir olarak değil, GMT+02:00 gibi bir fark olarak adlandırır ve bir Electron uygulamasının ana süreci JavaScript'i oturumun erişemediği Node içinde çalıştırır, bu yüzden gerçek saati korur - rapor bunu söyler.

İnsanları şaşırtan bir şey daha: zaten zamanlanmış bir aralık, oturum ortasında hızı değiştirdiğinizde eski hızını korur. Date.now, new Date() ve performance.now hemen tepki verir, çalışan bir setInterval vermez ve oturum, değişikliğin hiçbir şey yapmadığı sonucuna varmanıza izin vermek yerine bunu uyarır.

Ne kadar iyi test edildi

Deneysel, ve bu sözcüğün burada tanımlı bir anlamı var: karşısında geliştirildiği hedeflerde çalışır, geniş çapta test edilmemiştir ve yerleşik denetim, bu sayfa değil, sizin gerçeğin kaynağınızdır. Otomatik paketle değil elle, 64 bit Windows üzerinde gerçek bir Electron uygulamasına karşı doğrulandı.

Kapsama, süreç başına değil JavaScript bağlamı başına bildirilir; çünkü burada var olan birim budur. Boşta duran ve saati hiç sormayan bir uygulama dürüstçe belirsiz üretir - saat okumadı, dolayısıyla doğru olanı görüp görmeyeceği hakkında hiçbir şey iddia edilemez. Kararlar ne anlama geliyor →

Deneyin