0

dingo/api 0.10.0Laravel 5.1およびを使用して API を作成しましたlucadegasperi/oauth2-server-laravel": "^5.1"

私のルートはすべて Postman/Paw で正常に動作します!

を使用して API をテストしようとすると、問題が発生しますPHPUnit

これは私のroute-api.phpファイルの一部です

<?php

$api = app('Dingo\Api\Routing\Router');

$api->version(['v1'], function ($api) {

$api->post('oauth/access_token', function () {
    return response(
        \LucaDegasperi\OAuth2Server\Facades\Authorizer::issueAccessToken()
    )->header('Content-Type', 'application/json');
});

$api->group(['middleware' => ['oauth', 'api.auth']], function ($api) {
    $api->post('/register', 'YPS\Http\Controllers\Api\UserController@register');
});

そして、これは私のテストファイル UserRegistrationTest.php です

class UserRegistrationTest extends ApiTestCase
{

public function setUp()
{
    parent::setUp();
    parent::afterApplicationCreated();
}

public function testRegisterSuccess()
{
    $data = factory(YPS\User::class)->make()->toArray();
    $data['password'] = 'password123';

    $this->post('api/register', $data, $this->headers)
        ->seeStatusCode(201)
        ->seeJson([
            'email' => $data['email'],
            'first_name' => $data['first_name'],
            'last_name' => $data['last_name'],
        ]);
}

public function testRegisterMissingParams()
{
    $this->post('api/register', [], $this->headers, $this->headers, $this->headers)->seeStatusCode(422);
}
}

ApiTestCase は、トークンを取得してヘッダーを設定するだけです。

private function setHeaders()
{
    $this->headers = [
        'Accept' => 'application/vnd.yps.v1+json',
        'Authorization' => 'Bearer ' . $this->OAuthAccessToken,
    ];
}

さて、奇妙な部分は、最初のテストtestRegisterSuccessが完全に実行され、期待どおりの応答が返されることです。しかし、2 番目testRegisterMissingParamsのものは、同じルートであるにもかかわらず、これを返します。

array:2 [
      "message" => "The version given was unknown or has no registered routes."
      "status_code" => 400
 ] 

エラーを追跡しましたが、Laravel adapterここにあります:

public function dispatch(Request $request, $version)
{
    // it seems that the second time around can't find any routes with the key 'v1'
    if (! isset($this->routes[$version])) {
        throw new UnknownVersionException;
    }

    $routes = $this->mergeExistingRoutes($this->routes[$version]);

    $this->router->setRoutes($routes);

    return $this->router->dispatch($request);
}

さらに、一度に 1 つのテストを実行すると (たとえば、一方をコメントアウトしてテストを実行し、もう一方をコメントしてテストを実行すると)、両方のテストで予想される結果が表示されます。問題は、複数のテストを実行するときです。

それについて何か考えはありますか?

ありがとうございました!

4

2 に答える 2

0

Dingo & Lumen を使用したテストでも同じ問題が発生しました。これは私にとってbootstrap="bootstrap/app.php"はうまくいきました-phpunit.xmlファイルから削除し、行processIsolation="false"processIsolation="true".

于 2016-07-26T20:56:06.010 に答える
0

php artisan api:routes を実行して、URL の何かを見落としている可能性があるフル パスを確認します。また、手動で URL を要求した場合にこれが機能する場合はどうなりますか?

于 2016-07-20T10:29:20.567 に答える