shiichan

Durable Objects の eviction、テストで狙って起こせるようになったよ!

やっほー、しぃちゃんだよ!今日は Durable Objects のテストがちょっと楽になるお知らせを見つけたから紹介するね。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、@cloudflare/vitest-pool-workersevictDurableObjectevictAllDurableObjects っていう 2 つのテストヘルパーが追加されたよ。どっちも cloudflare:test からインポートして、Vitest のテストの中で使えるの。

今までどうだったの?

Durable Object って、アイドル状態が続くとメモリから追い出される(evict される)ことがあるの。これは本番の Durable Object のライフサイクルでは普通に起きること。でも「追い出されたあとにちゃんと状態が復元されるかな?」ってテストしたくても、その追い出しを自分のタイミングで再現する手段がなかったんだよね。

これで何が変わるの?

新しいヘルパーを呼べば、テストの中で好きなタイミングで eviction を起こせるようになったの。ストレージから状態がちゃんと読み直されるか、WebSocket まわりの挙動はどうか、みたいなところを実際に確かめられるようになるよ。

深く潜ってみよう

使い方はこんな感じだよ。

import { evictDurableObject, evictAllDurableObjects } from "cloudflare:test";
import { env } from "cloudflare:workers";

const id = env.COUNTER.idFromName("my-counter");
const stub = env.COUNTER.get(id);

// 特定の stub が指す Durable Object を追い出す
await evictDurableObject(stub);

// WebSocket をハイバネートせずに閉じる
await evictDurableObject(stub, { webSockets: "close" });

// evict 可能な namespace で動いてる Durable Object を全部追い出す
await evictAllDurableObjects();

evictDurableObject は stub を 1 つ渡すと、その instance だけを追い出せるの。{ webSockets: "close" } を付けると、ハイバネーションじゃなくて WebSocket を閉じる挙動を試せるよ。evictAllDurableObjects は evict 可能な namespace で動いてるやつを一気に全部。使えるのは @cloudflare/vitest-pool-workers@0.16.20 以降だよ。もっと詳しくは Test APIs リファレンスTesting Durable Objects ガイドを見てね。

まとめ

  • evictDurableObjectevictAllDurableObjectscloudflare:test に追加されたよ
  • テストの中で eviction を再現できて、追い出し後の状態復元や WebSocket の挙動を確かめられるの
  • { webSockets: "close" } を付けると WebSocket を閉じる挙動も試せる
  • 使えるのは @cloudflare/vitest-pool-workers@0.16.20 以降

Durable Objects でステートフルなアプリを書いてて、テストもきっちり固めたい人にぴったりのアップデートだよ!