PHPUnit中调用action()方法提示未定义,该如何解决?
解决Laravel测试中
action()方法未定义的问题 这个错误的原因很明确:action()方法在Laravel 5.4及之后的版本中已经被弃用并移除,所以你的测试类调用这个方法会触发未定义的错误。下面给你几种实用的替代方案:
方案1:直接用HTTP请求方法访问路由URL
如果你的addmember方法已经绑定了/addmember这个URL(就像你代码里第一行call()的写法),直接用Laravel测试套件提供的HTTP方法更直观,比如get():
public function testExample() { // 替代原来的call和action,直接发起GET请求 $response = $this->get('/addmember'); // 还可以添加断言验证请求结果,比如断言响应状态码为200 $response->assertStatus(200); }
方案2:通过路由名称调用(推荐)
如果你的路由在routes/web.php里定义了名称(比如Route::get('/addmember', [MemberController::class, 'addmember'])->name('member.add')),可以用route()助手生成URL再发起请求,这种方式更灵活,不怕URL变更:
public function testExample() { $response = $this->get(route('member.add')); $response->assertStatus(200); }
方案3:直接实例化控制器测试方法逻辑
如果不需要模拟完整的HTTP请求,只想测试控制器方法的业务逻辑,可以直接实例化控制器并调用方法:
use App\Http\Controllers\MemberController; // 记得引入控制器命名空间 public function testExample() { $controller = app(MemberController::class); $result = $controller->addmember(); // 根据方法返回值做断言,比如如果返回视图,断言视图名称正确 $this->assertEquals('addmember', $result->name()); }
选择哪种方案取决于你的测试目标:测试完整HTTP流程选方案1或2,单独测试控制器逻辑选方案3更高效。
内容的提问来源于stack exchange,提问作者Manuchehr Rahimov
相关产品推荐
相关产品推荐

