CakePHP单元测试:如何编写测试buildRules规则的测试用例方法
CakePHP buildRules 测试用例编写方法
首先明确:buildRules 中定义的是应用规则,和默认的实体验证规则触发时机不同:
- 实体验证规则在调用
newEntity()/patchEntity()时触发 - 应用规则仅在实体执行
save()操作,或者主动调用checkRules()方法时才会触发
前置准备
首先确保你的AdminUsersFixture中预先插入了一条基准测试数据,示例fixture数据参考:
// 在 AdminUsersFixture 的 $records 中添加 [ 'name' => 'Existing User', 'email' => 'existing@test.com', 'password' => 'Existing_pwd123', 'status' => 1, 'created' => '2024-01-01 10:00:00', 'modified' => '2024-01-01 10:00:00', ]
测试用例编写
在AdminUsersTableTest中新增两个测试方法,分别覆盖「重复邮箱校验不通过」和「新邮箱校验通过」两个场景:
/** * 测试邮箱唯一性应用规则(重复邮箱场景) */ public function testBuildRulesEmailUniqueFail() { // 构造和fixture中已有邮箱重复的用户数据 $data = [ 'name' => 'New User', 'email' => 'existing@test.com', // 和已有记录重复 'password' => 'New_pwd123', 'status' => 1, ]; $adminUser = $this->AdminUsers->newEntity($data); // 先验证实体基础校验无错误,排除基础验证影响 $this->assertEmpty($adminUser->getErrors()); // 触发应用规则校验,这里可以用checkRules直接校验,也可以调用save() $saveResult = $this->AdminUsers->save($adminUser); // 断言保存失败 $this->assertFalse($saveResult); // 断言存在email字段的唯一性错误 $errors = $adminUser->getErrors(); $this->assertArrayHasKey('email', $errors); $this->assertStringContainsString('已被使用', $errors['email']['_isUnique'] ?? ''); } /** * 测试邮箱唯一性应用规则(新邮箱场景) */ public function testBuildRulesEmailUniquePass() { $data = [ 'name' => 'New User', 'email' => 'new@test.com', // 未存在的新邮箱 'password' => 'New_pwd123', 'status' => 1, ]; $adminUser = $this->AdminUsers->newEntity($data); $this->assertEmpty($adminUser->getErrors()); $saveResult = $this->AdminUsers->save($adminUser); // 断言保存成功 $this->assertNotFalse($saveResult); // 断言无错误 $this->assertEmpty($adminUser->getErrors()); }
提示:错误信息的匹配内容可以根据你的CakePHP语言设置调整,中文环境下默认唯一性错误提示为「该值已被使用」,英文环境为「This value is already in use」。
优化说明
如果你不需要实际执行保存操作,也可以直接调用checkRules()方法触发应用规则校验,写法更轻量:
// 替换save的部分 $ruleCheckResult = $this->AdminUsers->checkRules($adminUser); $this->assertFalse($ruleCheckResult); // 重复场景下断言为false
内容的提问来源于stack exchange,提问作者Niloy Rony
相关产品推荐
相关产品推荐

