effect-vitest

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Entry Point

入口点

ts
import { it, expect } from "@effect/vitest"
FeatureDescription
it.effect
Injects
TestContext
(includes
TestClock
)
it.live
Uses live Effect environment (real clock, logging)
it.scoped
Provides a
Scope
for resource management
it.scopedLive
Combines
scoped
+
live
it.flakyTest
Retries flaky tests until success or timeout
ts
import { it, expect } from "@effect/vitest"
特性说明
it.effect
注入
TestContext
(包含
TestClock
it.live
使用真实的Effect环境(真实时钟、日志)
it.scoped
提供
Scope
用于资源管理
it.scopedLive
结合
scoped
+
live
特性
it.flakyTest
重试不稳定测试直到成功或超时

Basic Tests

基础测试

ts
import { it, expect } from "@effect/vitest"
import { Effect } from "effect"

it.effect("test success", () =>
  Effect.gen(function* () {
    const result = yield* Effect.succeed(42)
    expect(result).toBe(42)
  })
)
ts
import { it, expect } from "@effect/vitest"
import { Effect } from "effect"

it.effect("test success", () =>
  Effect.gen(function* () {
    const result = yield* Effect.succeed(42)
    expect(result).toBe(42)
  })
)

Testing Failures with Exit

使用Exit测试失败场景

ts
import { it, expect } from "@effect/vitest"
import { Effect, Exit } from "effect"

it.effect("test failure", () =>
  Effect.gen(function* () {
    const result = yield* Effect.exit(Effect.fail("oops"))
    expect(result).toStrictEqual(Exit.fail("oops"))
  })
)
ts
import { it, expect } from "@effect/vitest"
import { Effect, Exit } from "effect"

it.effect("test failure", () =>
  Effect.gen(function* () {
    const result = yield* Effect.exit(Effect.fail("oops"))
    expect(result).toStrictEqual(Exit.fail("oops"))
  })
)

TestClock

TestClock

it.effect
provides
TestClock
starting at
0
. Use
it.live
for real time.
ts
import { it } from "@effect/vitest"
import { Clock, Effect, TestClock } from "effect"

it.effect("with simulated time", () =>
  Effect.gen(function* () {
    yield* TestClock.adjust("1000 millis")
    const now = yield* Clock.currentTimeMillis
    // now === 1000
  })
)

it.live("with real time", () =>
  Effect.gen(function* () {
    const now = yield* Clock.currentTimeMillis
    // now === actual system time
  })
)
it.effect
提供初始值为
0
TestClock
。使用
it.live
来获取真实时间。
ts
import { it } from "@effect/vitest"
import { Clock, Effect, TestClock } from "effect"

it.effect("with simulated time", () =>
  Effect.gen(function* () {
    yield* TestClock.adjust("1000 millis")
    const now = yield* Clock.currentTimeMillis
    // now === 1000
  })
)

it.live("with real time", () =>
  Effect.gen(function* () {
    const now = yield* Clock.currentTimeMillis
    // now === actual system time
  })
)

Scoped Tests

作用域测试

Use
it.scoped
when your test acquires resources.
ts
import { it } from "@effect/vitest"
import { Console, Effect } from "effect"

const resource = Effect.acquireRelease(
  Console.log("acquire"),
  () => Console.log("release")
)

it.scoped("manages resources", () =>
  Effect.gen(function* () {
    yield* resource // automatically released after test
  })
)
当测试需要获取资源时,使用
it.scoped
ts
import { it } from "@effect/vitest"
import { Console, Effect } from "effect"

const resource = Effect.acquireRelease(
  Console.log("acquire"),
  () => Console.log("release")
)

it.scoped("manages resources", () =>
  Effect.gen(function* () {
    yield* resource // automatically released after test
  })
)

Flaky Tests

不稳定测试(Flaky Tests)

ts
import { it } from "@effect/vitest"
import { Effect, Random } from "effect"

const flaky = Effect.gen(function* () {
  if (yield* Random.nextBoolean) return yield* Effect.fail("random failure")
})

it.effect("retry until success", () =>
  it.flakyTest(flaky, "5 seconds")
)
ts
import { it } from "@effect/vitest"
import { Effect, Random } from "effect"

const flaky = Effect.gen(function* () {
  if (yield* Random.nextBoolean) return yield* Effect.fail("random failure")
})

it.effect("retry until success", () =>
  it.flakyTest(flaky, "5 seconds")
)

Test Modifiers

测试修饰符

ts
it.effect.skip("skipped test", () => Effect.void)
it.effect.only("run only this", () => Effect.void)
it.effect.fails("expected to fail", () => Effect.fail("expected"))
ts
it.effect.skip("skipped test", () => Effect.void)
it.effect.only("run only this", () => Effect.void)
it.effect.fails("expected to fail", () => Effect.fail("expected"))

Logging

日志

Logging is suppressed in
it.effect
. Enable with custom logger or
it.live
:
ts
import { it } from "@effect/vitest"
import { Effect, Logger } from "effect"

it.effect("with logging", () =>
  Effect.log("visible").pipe(Effect.provide(Logger.pretty))
)

it.live("logging enabled by default", () =>
  Effect.log("visible")
)
it.effect
中日志会被屏蔽。可通过自定义日志器或
it.live
启用:
ts
import { it } from "@effect/vitest"
import { Effect, Logger } from "effect"

it.effect("with logging", () =>
  Effect.log("visible").pipe(Effect.provide(Logger.pretty))
)

it.live("logging enabled by default", () =>
  Effect.log("visible")
)