概要
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}" が含まれていません`);
},
);