当phpunit测试时,所有Dingo路线返回404

时间:2017-10-25 07:30:31

标签: lumen dingo-api

原始发布在https://github.com/dingo/api/issues/1472

我正在使用Lumen 5.1和DingoApi 1.0.x进行api开发,现在我正在尝试进行一些验收测试。在Lumen的文档之后,我就是这样做的:

以下是app\Http\routes.php中的简化路线定义:

$app->get('/', function () use ($app) {
    return "Welcome to mysite.com";
});

$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
    $api->group([
        'prefix' => 'dealer',
        'middleware' => 'checkH5ApiSign'
    ], function ($api) {
        $api->get('list', 'App\Http\Controllers\Credit\DealerController@index');
        $api->get('staff_list', 'App\Http\Controllers\Credit\DealerController@getStaffList');
    });
}

我可以在浏览器中或通过邮递员访问使用$app$api(dingo)定义的两条路线,它们都可以返回200响应。但是每当我试图在phpunit中访问这些路由时,$app定义的路由如/对200个代码的响应没问题,但用$api(dingo)定义的所有路由都会响应404状态代码。这是我的测试代码:

class DealerTest extends TestCase
{
    public function testTest()
    {
        $this->get('/')->assertResponseOk();
        $this->get('/dealer/list')->assertResponseOk();
        $this->get('/dealer/staff_list')->assertResponseOk();
    }
}

并运行结果:

PHPUnit 5.7.5 by Sebastian Bergmann and contributors.

F                                                                  1 / 1 (100%)

Time: 590 ms, Memory: 6.00MB

There was 1 failure:

1) DealerTest::testTest
Expected status code 200, got 404.
Failed asserting that false is true.

E:\Gitrepos\api.fin.youxinjinrong.com\vendor\laravel\lumen-framework\src\Testing\AssertionsTrait.php:19
E:\Gitrepos\api.fin.youxinjinrong.com\tests\DealerTest.php:8

FAILURES!
Tests: 1, Assertions: 2, Failures: 1.

我试过通过Dingo包代码找到原因,但失败了。所有其他相关问题也无法解决我的问题。所以请帮助我。

更新

我按照了代码流程,看到FastRoute\DataGenerator\RegexBasedAbstract.php正在执行addRoute()操作,我在$this->staticRoutes)方法中转储了addRoute(),看到它在内部都正常浏览器和phpunit下。但奇怪的是,->getData()的以下调用表现不同:在浏览器中返回所有静态路由,但不在phpunit中。

希望这可以以某种方式有所帮助。我还在挖这个问题...

1 个答案:

答案 0 :(得分:2)

这样我就可以工作了; 使用创建问题的示例中的示例:

class DealerTest extends TestCase
{
    public function testTest()
    {
        $this->get('/')->assertResponseOk();
        $this->get('/dealer/list')->assertResponseOk();
        $this->get('/dealer/staff_list')->assertResponseOk();
    }
}

成为

class DealerTest extends TestCase
{
    public function testTest()
    {
        $this->get(getenv('API_DOMAIN') . '/v1/')->assertResponseOk();
        $this->get(getenv('API_DOMAIN') . '/v1/dealer/list')->assertResponseOk();
        $this->get(getenv('API_DOMAIN') . '/v1/dealer/staff_list')->assertResponseOk();
    }
}

我希望这对您有帮助