Saat Taklidi (Clock Mocking)
TestClock, tarayıcının Date nesnesini dondurmanıza veya ilerletmenize olanak tanır; böylece zamana duyarlı arayüzü veritabanına veya sistem saatine dokunmadan test edebilirsiniz.
Nasıl çalışır
clock().set(isoString) aktif tarayıcı sayfasına bir Date geçersiz kılma (override) enjekte eder. İstemci tarafı JavaScript'teki sonraki her new Date() ve Date.now() çağrısı, taklit edilen saati döndürür. Gerçek Date, window.__sbOriginalDate altında saklanır ve her testin sonunda otomatik olarak geri yüklenir.
Hızlı örnek
public class TrialBannerTest extends BaseTest {
@Test
public void showsExpiredBanner_when30DaysPast() {
open("/dashboard");
clock().set("2030-06-01T00:00:00Z"); // deneme süresi 30 gün önce doldu
getDriver().navigate().refresh(); // sayfa taklit edilen saatle yeniden çizilir
assertThat(By.id("trial-banner")).hasText("Your trial expired 30 days ago");
}
}
open() işlemini önce çağırınclock().set() JavaScript enjekte ettiği için aktif bir sayfa gerektirir. Önce open() çağırın, ardından saati ayarlayın ve son olarak istemci tarafı yeniden çizmeyi (refresh, SPA gezinmesi veya tarih getiren bir tıklama) tetikleyin.
API başvurusu
clock().set(String isoDateTime)
Tarayıcıdaki new Date() ve Date.now() işlemlerini verilen ana geçersiz kılar.
clock().set("2030-01-01T00:00:00Z");
- Herhangi bir ISO 8601 UTC dizesini kabul eder (
Instant.parseuyumlu) - Zincirleme için
thisdöndürür
clock().advance(Duration duration)
Taklit edilen saati mevcut taklitten itibaren duration kadar ilerletir. Etkin bir taklit yoksa, gerçek zamandan ilerletir.
clock().set("2030-01-01T00:00:00Z");
clock().advance(Duration.ofDays(30)); // artık 2030-01-31 olarak taklit edilir
Zincirleme için this döndürür. Yaygın süreler:
Duration.ofSeconds(30)
Duration.ofMinutes(5)
Duration.ofHours(1)
Duration.ofDays(90)
clock().reset()
Tarayıcıdaki gerçek Date uygulamasını geri yükler. Her testten sonra otomatik olarak çağrılır — açıkça çağrı yapmanız isteğe bağlıdır.
clock().set("2030-01-01T00:00:00Z");
// ... doğrulamalar ...
clock().reset(); // isteğe bağlı — framework bunu otomatik yapar
clock().getMockedTimeMs()
Şu anda taklit edilen saati milisaniye cinsinden epoch değeri olarak döndürür; etkin bir taklit yoksa null döndürür.
Yaygın kullanım örnekleri
Deneme / abonelik sona ermesi
// Deneme bitiş tarihinin 30 gün ötesine geç
clock().set("2030-06-01T00:00:00Z");
getDriver().navigate().refresh();
assertThat(By.id("trial-expired-banner")).isVisible();
Henüz aktif olmayan yaklaşan kampanya
// Kampanya başlamadan bir gün önce — buton gizli olmalı
clock().set("2030-04-30T23:59:59Z");
getDriver().navigate().refresh();
assertThat(By.id("promo-btn")).isHidden();
// Kampanya günü — buton görünür olmalı
clock().advance(Duration.ofSeconds(2));
getDriver().navigate().refresh();
assertThat(By.id("promo-btn")).isVisible();
Geri sayım sayaçları
open("/sale");
clock().set("2030-07-04T11:00:00Z");
getDriver().navigate().refresh();
assertThat(By.id("countdown")).containsText("1 hour remaining");
Zamanlanmış iş göstergesi
clock().set("2030-12-31T23:59:00Z");
getDriver().navigate().refresh();
assertThat(By.id("year-end-notice")).isVisible();
Zincirleme
open("/account");
clock()
.set("2030-01-01T00:00:00Z")
.advance(Duration.ofDays(365)); // artık 2031-01-01
getDriver().navigate().refresh();
assertThat(By.id("anniversary-badge")).isVisible();
Otomatik sıfırlama
Framework, her testten sonra tüm sonuç yollarında (başarı, başarısızlık, atlama) TestClock.autoReset() çağırır. Her test temiz, gerçek bir Date ile başlar. clock().reset() çağrısını hiçbir zaman açıkça yapmanız gerekmez.
Kapsam
TestClock, aktif sayfada Date nesnesini değiştirir. Yerel Chromium driverlarında (ChromiumDriver: Chrome, Edge) ayrıca CDP scripti kaydederek yenileme ve gezinme sonrasında aynı tarayıcı bağlamında taklidi tekrar uygular. Yukarıdaki refresh örnekleri bu CDP desteğini gerektirir. RemoteWebDriver (Selenium Grid, BrowserStack, Sauce Labs) ile CDP scripti kaydedilmez; taklit yenileme veya gezinmede kaybolur — gezinmeden sonra clock().set(...) çağrısını tekrarlayın. CDP kaydı başarısızsa TestFly uyarı yazar ve taklit yalnızca mevcut belgede kalır. Diğer tarayıcılarda gezinme sonrasında clock().set(...) işlemini tekrar çağırın; yeni sayfanın ilk yüklenmesinde taklit saatin geçerli olmasına güvenmeyin.
Şunları etkilemez:
- Sunucu tarafı tarih/saat kontrolleri (onlar için sunucu tarafı tarih geçersiz kılma veya ortam değişkeni kullanın)
- Diğer tarayıcı sekmeleri / pencereleri
- Test JVM'inde çalışan Java kodu
Yapılandırma
clock:
injectHeader: false # her istekle sunucuya X-Mock-Date başlığı gönder
headerName: X-Mock-Date # başlık adı (tarayıcı CDP desteği gerektirir)
injectHeader varsayılan olarak kapalıdır. Etkinleştirildiğinde, her tarayıcı isteği geçerli taklit saate ayarlanmış X-Mock-Date başlığını içerir; böylece bu başlığa saygı duyan arka uç servisleri aynı tarihi sunucu tarafında simüle edebilir.