0

所以我是一个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路由甚至不需要令牌,所以我继续查看我的应用程序中正在解析的令牌的位置。最后我意识到有一个叫做中间件的中间件ChangeDbKernal它看起来从除了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 应用程序生成的请求有所不同?如何解决这个问题?

4

1 回答 1

0

所以我认为Laravel5REST 部分中的依赖是问题所在。它没有模拟真实的HTTP请求,这就是为什么middleware无法分辨请求来自何处的原因。我将其更改为 PhpBrowser现在可以使用。PhpBrowser显然模拟了真实的HTTP请求。

于 2015-11-09T07:17:18.353 回答