Syntax for Layer.mock with Additional Layers in Effect TypeScript
I'm struggling w/ the syntax for
Layer.mockLayer.mock when it requires additonal layers.import { Console, Context, Effect, Layer } from "effect";
import type { User } from "../types/User";
import { DatabaseService } from "./DatabaseService";
export class EmailService extends Context.Tag("app/EmailService")<
EmailService,
{
readonly sendEmail: (
user: User,
) => Effect.Effect<boolean, never, DatabaseService>;
}
>() {}
export const EmailServiceTest = Layer.mock(EmailService, {
sendEmail: (user) =>
Effect.gen(function* () {
const dbService = yield* DatabaseService;
const db = yield* dbService.db;
yield* Console.log(`Mock: Sending email to ${user.email} with db: ${db}`);
return true;
}).pipe(
Effect.withSpan("EmailService.sendEmail", {
attributes: {
"service.name": "EmailService",
"operation.name": "sendEmail",
"operation.type": "notification",
"email.to": user.email,
},
}),
),
});import { Console, Context, Effect, Layer } from "effect";
import type { User } from "../types/User";
import { DatabaseService } from "./DatabaseService";
export class EmailService extends Context.Tag("app/EmailService")<
EmailService,
{
readonly sendEmail: (
user: User,
) => Effect.Effect<boolean, never, DatabaseService>;
}
>() {}
export const EmailServiceTest = Layer.mock(EmailService, {
sendEmail: (user) =>
Effect.gen(function* () {
const dbService = yield* DatabaseService;
const db = yield* dbService.db;
yield* Console.log(`Mock: Sending email to ${user.email} with db: ${db}`);
return true;
}).pipe(
Effect.withSpan("EmailService.sendEmail", {
attributes: {
"service.name": "EmailService",
"operation.name": "sendEmail",
"operation.type": "notification",
"email.to": user.email,
},
}),
),
});