让我们模拟一下一个简单的待办事项管理应用的开发过程。我们将按照下面的步骤一步步进行。
步骤 1:选择项目类型
我们选择开发一个命令行的待办事项管理工具,用户可以添加、列出和完成待办事项。
步骤 2:设计项目结构
我们将项目分为几个模块:
todo.ts
:主要逻辑和命令行交互task.ts
:待办事项任务相关逻辑utils.ts
:一些辅助函数
步骤 3:实现功能
// task.ts
export interface Task {
id: number;
description: string;
done: boolean;
}
let tasks: Task[] = [];
let currentId = 1;
export function addTask(description: string): void {
tasks.push({ id: currentId, description, done: false });
currentId++;
}
export function listTasks(): void {
tasks.forEach(task => {
const status = task.done ? "Done" : "Not done";
console.log(`${task.id}. ${task.description} (${status})`);
});
}
export function completeTask(id: number): void {
const task = tasks.find(task => task.id === id);
if (task) {
task.done = true;
}
}
// todo.ts
import { addTask, listTasks, completeTask } from "./task";
import * as readline from "readline";
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function prompt() {
rl.question("Enter command (add/list/complete/quit): ", answer => {
if (answer === "add") {
rl.question("Enter task description: ", description => {
addTask(description);
console.log("Task added.");
prompt();
});
} else if (answer === "list") {
listTasks();
prompt();
} else if (answer === "complete") {
rl.question("Enter task id to complete: ", id => {
completeTask(parseInt(id));
console.log("Task marked as completed.");
prompt();
});
} else if (answer === "quit") {
rl.close();
} else {
console.log("Invalid command.");
prompt();
}
});
}
prompt();
步骤 4:添加单元测试
我们使用 Jest 进行单元测试。
// task.test.ts
import { addTask, completeTask, listTasks } from "./task";
test("Add and list tasks", () => {
addTask("Buy groceries");
addTask("Read a book");
const logSpy = jest.spyOn(console, "log");
listTasks();
expect(logSpy).toHaveBeenCalledWith("1. Buy groceries (Not done)");
expect(logSpy).toHaveBeenCalledWith("2. Read a book (Not done)");
logSpy.mockRestore();
});
test("Complete task", () => {
completeTask(1);
const logSpy = jest.spyOn(console, "log");
listTasks();
expect(logSpy).toHaveBeenCalledWith("1. Buy groceries (Done)");
expect(logSpy).toHaveBeenCalledWith("2. Read a book (Not done)");
logSpy.mockRestore();
});
步骤 5:测试和调试
运行测试:npx jest
运行应用:node todo.js
在命令行中尝试添加、列出和完成待办事项,同时观察测试是否通过。