@clipboard-health/testing-core

中文文档
2.13.15发布于 2026/11/05MITTypeScriptCommonJS近 30 天下载 2.2万

TypeScript-friendly testing utilities.

原始使用文档
文档目录6 节
  1. Table of contents
  2. Install
  3. Usage
  4. Contract fixtures
  5. Type narrowing expect helpers
  6. Local development commands

@clipboard-health/testing-core

TypeScript-friendly testing utilities.

Table of contents

Install

npm install @clipboard-health/testing-core

Usage

Contract fixtures

Parse API response fixtures through their producer-owned Zod contract so drift fails when the fixture is constructed. Use buildContractFixture for one-off fixtures:

import { FeatureResponseSchema } from "@clipboard-health/contract-feature";
import { buildContractFixture } from "@clipboard-health/testing-core";

export const mockFeature = buildContractFixture({
  schema: FeatureResponseSchema,
  fixture: { id: "feature-id" },
});

Use createContractFixtureBuilder for fixture families with shallow overrides:

import { createContractFixtureBuilder } from "@clipboard-health/testing-core";

const buildFeature = createContractFixtureBuilder({
  schema: FeatureResponseSchema,
  defaults: { id: "default-id", name: "Default" },
});

export const mockRenamedFeature = buildFeature({ name: "Renamed" });

Both helpers accept schema input and return schema output, including Zod transforms.

Type narrowing expect helpers

Jest's expect(...).toBeDefined() does not narrow types.

This gives a type error:

const value = getValue(); // returns 'string | undefined'

expect(value).toBeDefined();

const { length } = value;
// ^? Property 'length' does not exist on type 'string | undefined'.

This library's helpers narrow types:

import { strictEqual } from "node:assert/strict";

import { expectToBeDefined } from "@clipboard-health/testing-core";

function getValue(): string | undefined {
  return "hi";
}

const value = getValue();
expectToBeDefined(value);

// Narrowed to `string`
const { length } = value;
strictEqual(length, 2);
import { strictEqual } from "node:assert/strict";

import { expectToBeLeft } from "@clipboard-health/testing-core";
import { either as E } from "@clipboard-health/util-ts";

function divide(numerator: number, denominator: number): E.Either<string, number> {
  if (denominator === 0) {
    return E.left("Cannot divide by zero");
  }

  return E.right(numerator / denominator);
}

const value = divide(10, 0);
expectToBeLeft(value);

// Narrowed to Left
strictEqual(value.left, "Cannot divide by zero");
import { strictEqual } from "node:assert/strict";

import { expectToBeRight } from "@clipboard-health/testing-core";
import { either as E } from "@clipboard-health/util-ts";

function divide(numerator: number, denominator: number): E.Either<string, number> {
  if (denominator === 0) {
    return E.left("Cannot divide by zero");
  }

  return E.right(numerator / denominator);
}

const value = divide(10, 2);
expectToBeRight(value);

// Narrowed to Right
strictEqual(value.right, 5);
import { strictEqual } from "node:assert/strict";

import { expectToBeFailure } from "@clipboard-health/testing-core";
import { failure, type ServiceResult, success } from "@clipboard-health/util-ts";

function validateAge(age: number): ServiceResult<number> {
  if (age < 0) {
    return failure({ issues: [{ code: "INVALID_AGE", message: "Age cannot be negative" }] });
  }

  return success(age);
}

const result = validateAge(-5);
expectToBeFailure(result);

// Narrowed to Left (Failure)
strictEqual(result.left.issues[0]?.message, "Age cannot be negative");
import { strictEqual } from "node:assert/strict";

import { expectToBeSuccess } from "@clipboard-health/testing-core";
import { failure, type ServiceResult, success } from "@clipboard-health/util-ts";

function validateAge(age: number): ServiceResult<number> {
  if (age < 0) {
    return failure({ issues: [{ code: "INVALID_AGE", message: "Age cannot be negative" }] });
  }

  return success(age);
}

const result = validateAge(25);
expectToBeSuccess(result);

// Narrowed to Right (Success)
strictEqual(result.right, 25);
import { strictEqual } from "node:assert/strict";

import { expectToBeDefined, expectToBeSafeParseError } from "@clipboard-health/testing-core";
import { z } from "zod";

const schema = z.object({ name: z.string() });

const value = schema.safeParse({ name: 1 });
expectToBeSafeParseError(value);

// Narrowed to `SafeParseError`
const [firstIssue] = value.error.issues;
expectToBeDefined(firstIssue);

// Narrowed to `ZodIssue`
strictEqual(firstIssue.message, "Expected string, received number");
import { strictEqual } from "node:assert/strict";

import { expectToBeSafeParseSuccess } from "@clipboard-health/testing-core";
import { z } from "zod";

const schema = z.object({ name: z.string() });

const value = schema.safeParse({ name: "hi" });
expectToBeSafeParseSuccess(value);

// Narrowed to `SafeParseSuccess`
strictEqual(value.data.name, "hi");

Local development commands

See package.json scripts for a list of commands.

版本与发布记录

@clipboard-health/testing-core 共发布 480 个版本,首次发布于 2024/10/23;过去 12 个月发布了 385 个版本。

版本发布日期距今
2.13.15latest2026/11/054 天前
2.13.142026/11/054 天前
2.13.132026/11/045 天前
2.13.122026/10/3110 天前
2.13.112026/10/2812 天前
2.13.102026/10/2813 天前

关于 @clipboard-health/testing-core 的常见问题

@clipboard-health/testing-core 是什么?

TypeScript-friendly testing utilities.

如何安装 @clipboard-health/testing-core?

在项目目录运行 npm install @clipboard-health/testing-core,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:zod(^3)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@clipboard-health/testing-core 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@clipboard-health/testing-core 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@clipboard-health/testing-core 可以商用吗?

@clipboard-health/testing-core 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@clipboard-health/testing-core 的下载量有多少?

根据 npm 官方下载统计,@clipboard-health/testing-core 在 2026/10/10 – 2026/11/08 这 30 天内被下载 21,913 次,日均约 730 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@clipboard-health/testing-core 还在维护吗?

最新版本 2.13.15 发布于 2026/11/05(4 天前);至今共发布 480 个版本,其中过去 12 个月发布了 385 个;首次发布于 2024/10/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。