Hyperlinkv0.8.0-beta.28

Layer

Layer.mockconsteffect/Layer.ts:2262
<I, S extends object>(service: Context.Key<I, S>): (
  implementation: PartialEffectful<S>
) => Layer<I>
<I, S extends object>(
  service: Context.Key<I, S>,
  implementation: Types.NoInfer<PartialEffectful<S>>
): Layer<I>

Creates a mock layer for testing purposes. You can provide a partial implementation of the service. Any missing members that are Effects, Streams, Channels, or functions returning them will fail with an unimplemented defect when used.

Details

Missing members are represented by a value that can be used as an Effect, Stream, Channel, or as a function returning an Effect. This lets the mock preserve the shape of common service methods while still failing loudly when an unimplemented member is exercised.

Example (Mocking services for tests)

import { Context, Effect, Layer } from "effect"

class UserService extends Context.Service<UserService, {
  readonly config: { apiUrl: string }
  readonly getUser: (
    id: string
  ) => Effect.Effect<{ id: string; name: string }, Error>
  readonly deleteUser: (id: string) => Effect.Effect<void, Error>
  readonly updateUser: (
    id: string,
    data: object
  ) => Effect.Effect<{ id: string; name: string }, Error>
}>()("UserService") {}

// Create a partial mock - only implement what you need for testing
const testUserLayer = Layer.mock(UserService, {
  config: { apiUrl: "https://test-api.com" }, // Required - non-Effect property
  getUser: (id: string) => Effect.succeed({ id, name: "Test User" }) // Mock implementation
  // deleteUser and updateUser are omitted - will throw UnimplementedError if called
})

// Use in tests
const testProgram = Effect.gen(function*() {
  const userService = yield* UserService

  // This works - we provided an implementation
  const user = yield* userService.getUser("123")
  console.log(user.name) // "Test User"

  // This would throw - we didn't implement deleteUser
  // yield* userService.deleteUser("123") // UnimplementedError
}).pipe(
  Effect.provide(testUserLayer)
)
testing
Source effect/Layer.ts:22629 lines
export const mock: {
  <I, S extends object>(service: Context.Key<I, S>): (implementation: PartialEffectful<S>) => Layer<I>
  <I, S extends object>(service: Context.Key<I, S>, implementation: Types.NoInfer<PartialEffectful<S>>): Layer<I>
} = function() {
  if (arguments.length === 1) {
    return (implementation: any) => mockImpl(arguments[0], implementation)
  }
  return mockImpl(arguments[0], arguments[1])
} as any