使用create方法后PHP单元测试创建记录失败求助
你的测试失败原因及修复方案
先帮你拆解下问题所在:
核心问题:测试请求的参数不符合业务规则
你写的测试里传的参数全是空字符串,还有help和list字段直接传了'$request->input()'这种PHP代码字符串——线上环境用户提交的合法请求肯定不会是这样的,控制器里大概率有表单验证逻辑(比如必填项、格式校验),所以这个测试请求会被验证拦截,返回的状态码根本不是你断言的201,自然测试失败。
怎么修复?
你需要模拟真实的合法请求参数来编写测试,举个例子:
public function testSendContactMail() { $response = $this->call('POST','/contact-us',[ 'name' => 'Dylan', 'phone' => '1234567890', 'email' => 'test@example.com', 'message' => '这是一条测试咨询消息', 'contact' => 'email', // 假设这个字段是联系方式选项,比如选邮箱 'help' => '技术问题', // 假设是求助类型 'list' => '订阅资讯' // 假设是订阅选项 ]); $response->assertStatus(201); }
如果还想测试参数不合法的场景,那就要对应断言正确的状态码(比如Laravel里验证失败返回422):
public function testSendContactMailWithInvalidParams() { $response = $this->call('POST','/contact-us',[ 'name' => '', 'phone' => '', 'email' => '不是合法邮箱', 'message' => '', 'contact' => '', 'help' => '', 'list' => '' ]); $response->assertStatus(422); // 验证失败的状态码 }
另外提个小细节:如果控制器用了create操作数据库,记得给测试类加上RefreshDatabase trait(Laravel框架的话),这样测试会自动回滚数据库操作,避免测试数据污染。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

