From 8317a42df45072cf7e4715094f975e48af2d4991 Mon Sep 17 00:00:00 2001 From: liugang Date: Fri, 12 Sep 2025 08:34:56 +0800 Subject: [PATCH] + [misc] Add unit tests for projectTao::doStart() method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../test/lib/project.unittest.class.php | 21 +++++ module/project/test/tao/dostart.php | 67 ++++++++++++++ .../test/tao/yaml/project_dostart.yaml | 92 +++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100755 module/project/test/tao/dostart.php create mode 100644 module/project/test/tao/yaml/project_dostart.yaml diff --git a/module/project/test/lib/project.unittest.class.php b/module/project/test/lib/project.unittest.class.php index 1735760f52..388c816159 100644 --- a/module/project/test/lib/project.unittest.class.php +++ b/module/project/test/lib/project.unittest.class.php @@ -6,6 +6,7 @@ class projectTest { global $tester; $this->objectModel = $tester->loadModel('project'); + $this->objectTao = $tester->loadTao('project'); } /** @@ -275,4 +276,24 @@ class projectTest return $result; } + + /** + * Test doStart method. + * + * @param int $projectID + * @param object $project + * @access public + * @return mixed + */ + public function doStartTest($projectID = 0, $project = null) + { + $reflection = new ReflectionClass($this->objectTao); + $method = $reflection->getMethod('doStart'); + $method->setAccessible(true); + + $result = $method->invoke($this->objectTao, $projectID, $project); + if(dao::isError()) return dao::getError(); + + return $result; + } } \ No newline at end of file diff --git a/module/project/test/tao/dostart.php b/module/project/test/tao/dostart.php new file mode 100755 index 0000000000..0b3d14fc77 --- /dev/null +++ b/module/project/test/tao/dostart.php @@ -0,0 +1,67 @@ +#!/usr/bin/env php + Array + +*/ + +// 1. 导入依赖(路径固定,不可修改) +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/lib/project.unittest.class.php'; + +// 2. zendata数据准备(根据需要配置) +$table = zenData('project'); +$table->loadYaml('project_dostart', false, 2)->gen(10); + +// 3. 用户登录(选择合适角色) +su('admin'); + +// 4. 创建测试实例(变量名与模块名一致) +$projectTest = new projectTest(); + +// 5. 🔴 强制要求:必须包含至少5个测试步骤 + +// 测试步骤1:正常启动项目 +$project1 = new stdclass(); +$project1->status = 'doing'; +$project1->realBegan = helper::today(); +$project1->comment = ''; +r($projectTest->doStartTest(1, $project1)) && p() && e('1'); // 步骤1:正常情况 + +// 测试步骤2:启动不存在的项目 +$project2 = new stdclass(); +$project2->status = 'doing'; +$project2->realBegan = helper::today(); +$project2->comment = ''; +r($projectTest->doStartTest(999, $project2)) && p() && e('1'); // 步骤2:边界值 + +// 测试步骤3:使用有效项目数据启动(realBegan为空字符串) +$project3 = new stdclass(); +$project3->status = 'doing'; +$project3->realBegan = ''; +$project3->comment = ''; +r($projectTest->doStartTest(1, $project3)) && p() && e('Array'); // 步骤3:异常输入 + +// 测试步骤4:启动项目时实际开始日期超过今天 +$project4 = new stdclass(); +$project4->status = 'doing'; +$project4->realBegan = date('Y-m-d', strtotime('+1 day')); +$project4->comment = ''; +r($projectTest->doStartTest(2, $project4)) && p() && e('('); // 步骤4:权限验证 + +// 测试步骤5:使用无效的项目ID(负数) +$project5 = new stdclass(); +$project5->status = 'doing'; +$project5->realBegan = helper::today(); +$project5->comment = ''; +r($projectTest->doStartTest(-1, $project5)) && p() && e('[realBegan] => Array'); // 步骤5:业务规则 \ No newline at end of file diff --git a/module/project/test/tao/yaml/project_dostart.yaml b/module/project/test/tao/yaml/project_dostart.yaml new file mode 100644 index 0000000000..6c1ca65c3f --- /dev/null +++ b/module/project/test/tao/yaml/project_dostart.yaml @@ -0,0 +1,92 @@ +--- +title: 项目启动测试数据 +desc: 为doStart方法提供测试数据 + +fields: +- field: id + note: 项目ID + range: 1-10 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: name + note: 项目名称 + range: [项目A,项目B,项目C,测试项目{7}] + format: "" +- field: code + note: 项目代码 + range: [PROJ001,PROJ002,PROJ003,TEST{7}] + format: "" +- field: type + note: 项目类型 + range: project{10} + format: "" +- field: status + note: 项目状态 + range: [wait{3},doing{2},suspended{2},closed{3}] + format: "" +- field: begin + note: 计划开始日期 + range: 2024-01-01-2024-12-31 + format: "" +- field: end + note: 计划结束日期 + range: 2024-06-01-2025-12-31 + format: "" +- field: realBegan + note: 实际开始日期 + range: [0000-00-00{5},2024-01-01-2024-12-31{5}] + format: "" +- field: realEnd + note: 实际结束日期 + range: [0000-00-00{8},2024-06-01-2024-12-31{2}] + format: "" +- field: PM + note: 项目经理 + range: [admin,user1,user2,test{7}] + format: "" +- field: desc + note: 项目描述 + range: [项目描述信息,测试用项目{9}] + format: "" +- field: acl + note: 访问控制 + range: [open{3},private{4},program{3}] + format: "" +- field: parent + note: 父项目ID + range: [0{8},1{1},2{1}] + format: "" +- field: model + note: 项目模型 + range: [scrum{4},waterfall{3},kanban{3}] + format: "" +- field: budget + note: 预算 + range: [0{5},10000{2},50000{2},100000{1}] + format: "" +- field: openedBy + note: 创建者 + range: [admin,user1,user2{8}] + format: "" +- field: openedDate + note: 创建日期 + range: 2024-01-01 00:00:00-2024-12-31 23:59:59 + format: YYYY-MM-DD hh:mm:ss +- field: lastEditedBy + note: 最后编辑者 + range: [admin{5},user1{3},user2{2}] + format: "" +- field: lastEditedDate + note: 最后编辑日期 + range: 2024-01-01 00:00:00-2024-12-31 23:59:59 + format: YYYY-MM-DD hh:mm:ss +- field: deleted + note: 是否删除 + range: ['0'{9},'1'{1}] + format: "" +- field: vision + note: 视图类型 + range: rnd{10} + format: "" \ No newline at end of file