所以我是一个codeception新手,我正试图弄清楚如何使用它来测试我的web服务。我已经为authenticate
路由编写了我的第一个简单测试,只是为了确保应用程序正确地吐出 JWT 令牌。测试看起来像这样:
<?php
$I = new ApiTester($scenario);
$I->wantTo('authenticate a user');
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
$I->sendPOST('/api/authenticate', [
'username' => 'archive',
'email' => 'admin@admin.com',
'password' => 'password'
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
在我的辩护中,我尝试了 Postman 的相同 POST,并且效果很好。
api.suite.yml
class_name: ApiTester
modules:
enabled:
- REST:
url: http://localhost:8000/api/
depends: Laravel5
config:
Laravel5:
environment_file: .env.testing
我在此测试中面临的问题是它没有将200 OK
视为响应代码,而是将其视为响应代码500
。后来我意识到我可以通过_output
目录中相同的输出,我看到了这个错误:
无法从请求中解析令牌
现在令我惊讶的是,authenticate
路由甚至不需要令牌,所以我继续查看我的应用程序中正在解析的令牌的位置。最后我意识到有一个叫做中间件的中间件ChangeDb
,Kernal
它看起来从除了authenticate
路由之外的每个请求中检查令牌。它看起来像这样:
public function handle($request, Closure $next)
{
if($request->path() != 'api/authenticate'){
$username = \JWTAuth::parseToken()->getPayload()->get('username');
if(! $username){
\Config::set('database.connections.tenant.database', 'archive');
\DB::reconnect();
\DB::setDatabaseName('archive');
}else{
\Config::set('database.connections.tenant.database', $username);
}
}
return $next($request);
}
但是当我试图从内核中对此进行评论时,测试运行良好并给了我绿色。因此,当我从 Postman 和其他 ajax 请求尝试它时,不知何故这个中间件运行良好,但是当 Codeception 尝试请求时,if statement
返回true
显然是因为它查看令牌,这是我的测试失败的地方。
那么为什么会这样呢?Codeception 生成的请求是否与 Postman 或我前端的 ajax 应用程序生成的请求有所不同?如何解决这个问题?