🦁
値オブジェクトで状態(enum)を管理したい(DDD)
値オブジェクトで状態(enum)を管理したい(DDD)
- タグの値オブジェクトがあって、「draft・open・onlyMember」の3つの状態を管理したい。
- これら以外のタグ名で値オブジェクトを生成しようとしたらエラーが発生する
- ついでに補完を効かせたい
コード
import { ValueObject } from '@/domain/shared/valueObject';
export interface ITag {
tag: string;
}
export const TagType = {
draft: '下書き',
open: '公開',
onlyMember: 'メンバーのみ',
} as const;
export type TagType = typeof TagType[keyof typeof TagType];
export class Tag extends ValueObject<ITag> {
public get tag() {
return this.props.tag;
}
private constructor(props: ITag) {
super(props);
}
public static create(props: ITag): Tag {
const tagList = Object.values(TagType);
if (!tagList.find((tag:TagType)=> tag === props.tag)) {
throw new Error('タグ名が誤っています。');
}
return new Tag(props);
}
}
テスト
jest
import { ITag, Tag, TagType } from "@/domain/tag/tag";
describe('タグ', (): void => {
// 正常系のテスト
test('タグの値オブジェクトを生成できる', () => {
// 「TagType.」とまで打てばIDEの補完機能で
// 「draft・open・onlyMember」のいずれかが表示されるので便利
const draft:ITag = {tag: TagType.draft}
// 上記で生成したのを引数に値オブジェクトを生成
const actual = Tag.create(draft);
// 生成されている
expect(actual).toBeInstanceOf(Tag);
expect(actual.tag).toBe(draft.tag)
});
// 以上系のテスト
test('想定していないタグで値オブジェクトは生成できない', () => {
// 想定していない間違ったタグ
const bad:ITag = {tag: "bad"}
// 値オブジェクトを生成するとエラーが起きる
expect(() => {
Tag.create(bad);
}).toThrowError('タグ名が誤っています。');
});
});
Discussion