0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cucumber.jsをts-node/esmで動かしてみたメモ

Posted at

概要

AIに7割書いてもらったが、微調整が必要だったのでメモしておく。
ソースコード

ソースコード

packages/core/package.json
{
  "name": "@odyssage/core",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "test": "cucumber-js --config cucumber.mjs",
    "ncu": "ncu -u"
  },
  "devDependencies": {
    "@cucumber/cucumber": "^11.0.1",
    "@types/node": "^22.9.0",
    "ts-node": "^10.9.2",
    "vitest": "^2.1.4"
  }
}

packages/core/cucumber.mjs
export default {
  paths: ['**/features/*.feature'],
  import: ['**/step-definitions/*.step.ts'],
  loader: ['ts-node/esm'],
}
packages/core/character/tests/bdd/features/character.feature
Feature: キャラクターの作成

  Scenario: 新しいキャラクターを作成する
    Given ユーザーがキャラクター作成フォームを開いている
    When "太郎" という名前でキャラクターを作成する
    Then キャラクターリストに "太郎" が表示されている

  Scenario: キャラクターにタグを追加する
    Given キャラクター "太郎" が存在する
    When "力持ち" のタグを追加する
    Then "太郎" のタグリストに "力持ち" が含まれている

packages/core/character/tests/bdd/step-definitions/character.step.ts
import { When, Then, Given } from '@cucumber/cucumber';
// Node.js は Native ESM モードでは拡張子を補完しない
import { CharacterService } from '@odyssage/core/character/application/CharacterService.ts';
import { Character } from '@odyssage/core/character/domain/Character.ts';
import { Tag } from '@odyssage/core/character/domain/Tag.ts';
import { CharacterRepository } from '@odyssage/core/character/infrastructure/CharacterRepository.ts';
import { strict as assert } from 'assert';

let character: Character;
let repository: CharacterRepository;
let service: CharacterService;

Given('ユーザーがキャラクター作成フォームを開いている', () => {
  repository = new CharacterRepository();
  service = new CharacterService(repository);
});

When(/"(.+)" という名前でキャラクターを作成する/, (name: string) => {
  character = { id: '1', name, tags: [], extendedTags: [] };
  repository.add(character);
});

Then(/キャラクターリストに "(.+)" が表示されている/, (name: string) => {
  const characters = repository.listAll();
  const found = characters.some((c) => c.name === name);
  assert(found, `キャラクターリストに "${name}" が表示されていません`);
});

Given(/キャラクター "(.+)" が存在する/, (name: string) => {
  character = { id: '1', name, tags: [], extendedTags: [] };
  repository.add(character);
});

When(/"(.+)" のタグを追加する/, (tag: string) => {
  const newTag: Tag = tag;
  service.addTag(character.id, newTag);
});

Then(
  /"(.+)" のタグリストに "(.+)" が含まれている/,
  (name: string, tag: string) => {
    const character = repository.findById('1');
    assert(character, `キャラクター "${name}" が存在しません`);
    const found = character.tags.some((t) => t === tag);
    assert(found, `"${name}" のタグリストに "${tag}" が含まれていません`);
  },
);

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?