파일 읽기/쓰기 모듈이 있는 Deno입니다.test

우리는 다음ts-morph의overload를 추가로 사용하는 함수 테스트를 준비했다.
import { FunctionDeclaration } from "https://deno.land/x/[email protected]/mod.ts";

type Parameter = { name: string; type: string };
type Entry = { parameters: Parameter[] };

export const addCustomEntries = (
  entries: Entry[],
  constructor: FunctionDeclaration
) => {
  constructor.addOverloads(
    entries.map((entry) => ({
      parameters: entry.parameters,
      returnType: "string",
    }))
  );
};

helper의 정의


파일을 읽고 쓰기 위한 앞뒤 처리를 위한 조수 함수를 정의합니다.
helper.ts
import {
  Project,
  SourceFile,
  ManipulationSettings,
  IndentationText,
} from "https://deno.land/x/[email protected]/mod.ts";

export const withDir = async (
  cb: (tempDir: string) => void | Promise<void>
) => {
  const tempDir = await Deno.makeTempDir({
    prefix: "deno_couscous_test_",
  });
  await cb(tempDir);
  await Deno.remove(tempDir, { recursive: true });
};

export const withSource = (
  cb: (tempSrc: SourceFile) => void | Promise<void>,
  manipulationSettings: Partial<ManipulationSettings> = {
    indentationText: IndentationText.TwoSpaces,
  }
) =>
  withDir(async (tempDir) => {
    const tempFile = await Deno.makeTempFile({ dir: tempDir });
    const project = new Project({
      libFolderPath: tempDir,
      manipulationSettings,
    });
    const source = project.addSourceFileAtPath(tempFile);
    await cb(source);
  });

파일 간의 결단을 비교하는 정의까지.
assertEqualFiles.ts
import { assertEquals } from "https://deno.land/[email protected]/testing/asserts.ts";

export const assertEqualFile = async (
  receivedPath: string,
  expectedPath: string
) => {
  const [received, expected] = await Promise.all([
    Deno.readTextFile(receivedPath),
    Deno.readTextFile(expectedPath),
  ]);
  await assertEquals(received, expected);
};

테스트 용례의 설치


이번에는 스냅샷 테스트의 출력 결과를 엄격하게 인코딩했지만 설치 방법에 따라 자동으로 생성할 수 있다.
output.ts.snapshot
function hoge(piyo: string): string;
function hoge(piyo: string, foo: number): string;
function hoge(foo: number, bar: boolean): string;
function hoge(piyo: string, foo: number, bar: number): string;
function hoge() {
  return ""
}

오버로드 검사이기 때문에 함수 자체의 검사가 포함되지 않기 때문에 테스트 전에 최소한의 설치를 추가합니다.
test.ts
import { StructureKind } from "https://deno.land/x/[email protected]/mod.ts";
import { withSource } from "./helper.ts";
import { assertEqualFile } from "./assertEqualFiles.ts";
import { addCustomEntries } from "./mod.ts";

Deno.test(
  "addCustomEntries",
  { permissions: { read: true, write: true } },
  () =>
    withSource(async (source) => {
      const constructor = source.addFunction({
        name: "hoge",
        kind: StructureKind.Function,
        statements: 'return ""',
      });
      addCustomEntries(
        [
          {
            parameters: [{ name: "piyo", type: "string" }],
          },
          {
            parameters: [
              { name: "piyo", type: "string" },
              { name: "foo", type: "number" },
            ],
          },
          {
            parameters: [
              { name: "foo", type: "number" },
              { name: "bar", type: "number" },
            ],
          },
          {
            parameters: [
              { name: "piyo", type: "string" },
              { name: "foo", type: "number" },
              { name: "bar", type: "number" },
            ],
          },
        ],
        constructor
      );
      await source.save();
      assertEqualFile(source.getFilePath(), "output.ts.snapshot");
    })
);

실행 결과



추기의 여담


denotest를 실행할 때 로고를 제출할 수 있기 때문에 업데이트용 로고를 추가하면 스냅샷의 결과를 자동으로 업데이트할 수 있습니다.
import {
  assertEquals,
  equal,
} from "https://deno.land/[email protected]/testing/asserts.ts";
import { copy } from "https://deno.land/[email protected]/fs/mod.ts";

export const assertSnapshot = async (
  receivedPath: string,
  expectedPath: string
) => {
  const [received, expected] = await Promise.all([
    Deno.readTextFile(receivedPath),
    Deno.readTextFile(expectedPath),
  ]);
  if (Deno.args.includes("update_snapshot")) {
    if (equal(received, expected)) return;
    await copy(receivedPath, expectedPath, { overwrite: true });
  } else {
    assertEquals(received, expected);
  }
};
스냅샷 업데이트 플래그를 추가할 수 있습니다.🎉deno test test.ts --allow-read --allow-write -- update_snapshot

좋은 웹페이지 즐겨찾기