0Pricing
TypeScript Academy · レッスン

テストとモックの型付け、expectTypeOf

expectTypeOfで静的チェックを行い、Vitest/Jestで型安全なモックを使って壊れやすいテストを防ぎます

「テストとモックの型付け、expectTypeOf」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。

導入

目標:expectTypeOfで型を検証し、型安全なモックを作成して、リファクタリングでテストが気付かないうちに壊れるのを防ぎます。

expectTypeOfの基本

expectTypeOfはVitestでコンパイル時に型を検証します。実行時のコストはありませんが、不一致を早期に検出できます。

// Vitest provides expectTypeOf
import { expectTypeOf } from "vitest";

function fullName(first: string, last: string) {
  return `${first} ${last}`
}

// static checks (compile-time)
expectTypeOf(fullName).toBeFunction()
expectTypeOf(fullName("Ada","Lovelace")).toBeString()

高度なアサーション

便利なパターンには、Awaited<ReturnType<...>>による戻り値の型の解決や、リテラルおよびユニオンの比較があります。

import { expectTypeOf } from "vitest";

interface User { id: number; name: string }
function getUser(): Promise<User> { return Promise.resolve({ id:1, name:"A" }) }

// unwrap Promise
type Resolved = Awaited<ReturnType<typeof getUser>>
expectTypeOf<Resolved>().toMatchTypeOf<User>()

// literal + union
const status = "ok" as const
expectTypeOf(status).toEqualTypeOf<"ok">()

Vitestのモック

vi.fnにシグネチャを指定して、モックを正しく型付けします。誤った引数はコンパイル時に検出されます。

import { vi, describe, it, expect } from "vitest";

function fetchUser(id: number): Promise<string> {
  return Promise.resolve(`user-${id}`)
}

// typed mock
const mockFetch: ReturnType<typeof vi.fn<[(id: number), Promise<string>]>> = vi.fn(async (id: number) => `user-${id}`)

it("uses typed mock", async () => {
  const name = await mockFetch(5)
  expect(name).toBe("user-5")
  // mockFetch("x") // TS error: id must be number
})

Jestのモック

Jestではjest.fn<Signature>();と記述して呼び出しシグネチャを適用します。MockedFunctionを使うとモックの型を明確にできます。

import { jest } from "@jest/globals";

function times(a: number, b: number) { return a * b }

const mul = jest.fn<(a:number,b:number)=>number>((a,b)=>a*b)

mul(2,3) // ok
// mul("2",3) // TS error

// MockedFunction utility
type MulMock = jest.MockedFunction<typeof mul>
const _check: MulMock = mul

ヒント

値の検証(実行時)と型の検証(コンパイル時)を分けて考えます。これらは異なる層です。

// value assertions
import { expect } from "vitest";
expect(2 + 3).toBe(5)

// type assertions (compile-time)
import { expectTypeOf } from "vitest";
expectTypeOf(2 + 3).toBeNumber()

// don't confuse with runtime validators like zod

問題

クイックチェック:テストの実行中にexpectTypeOfが検証するのは何でしょうか。

まとめ

まとめ:expectTypeOfはコンパイル時の型保証を行い、vi.fn/jest.fnはシグネチャ付きの型安全なモックを作成します。

よくある質問

「テストとモックの型付け、expectTypeOf」レッスンは無料ですか?

はい。「テストとモックの型付け、expectTypeOf」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。

「テストとモックの型付け、expectTypeOf」で何を学びますか?

expectTypeOfで静的チェックを行い、Vitest/Jestで型安全なモックを使って壊れやすいテストを防ぎます ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「テストとモックの型付け、expectTypeOf」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Vitest/JestのTS向け設定
  2. テストとモックの型付け、expectTypeOf
  3. E2Eの型付け入門(Playwright/Cypress)
← TypeScript Academyに戻る