Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Codeception测试Laravel5API?_Php_Laravel_Laravel 5_Codeception - Fatal编程技术网

Php 如何使用Codeception测试Laravel5API?

Php 如何使用Codeception测试Laravel5API?,php,laravel,laravel-5,codeception,Php,Laravel,Laravel 5,Codeception,我是Codeception的新手,我正在尝试测试我使用Laravel5构建的web服务。我跟着导游走 因此,我首先创建了一个名为api的套件: codecept generate:suite api api.suite.yml class_name: ApiTester modules: enabled: - REST: url: http://localhost:8000/api/ depends: Laravel5

我是Codeception的新手,我正在尝试测试我使用Laravel5构建的web服务。我跟着导游走

因此,我首先创建了一个名为api的套件:

codecept generate:suite api
api.suite.yml

class_name: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost:8000/api/
            depends: Laravel5
class_name: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost:8000/api/
            depends: Laravel5
    config: 
        Laravel5:
            environment_file: .env.testing
AuthenticateUserCept.php

<?php 
$I = new ApiTester($scenario);
$I->wantTo('authenticate a user');
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
$I->sendPOST('/authenticate', [
    'username' => 'archive',
    'email' => 'admin@admin.com',
    'password' => 'password'
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
我哪里做错了?此外,我还不清楚如何重构这个特定的测试,以便为我提出的其他请求提供一个JWT。感谢您的帮助

编辑api.suite.yml中的更改

class_name: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost:8000/api/
            depends: Laravel5
class_name: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost:8000/api/
            depends: Laravel5
    config: 
        Laravel5:
            environment_file: .env.testing

在我回答之前,我想提出一些意见:

  • 在api.suite.yml中的enabled行上,我包括:enabled:[PhpBrowser,REST,ApiHelper,Asserts]
  • REST行中的url对API套件没有任何影响,它通常只用于验收套件。这应该是通过直接进入代码的路由完成所有操作,而不是使用phpbrowser模式或类似的方式进行HTTP调用
  • 不使用PhpBrowser模式,您可以使用Laravel5模式——前者将通过中间件发送请求,如果APP_ENV设置为testing,Laravel5模式将不会通过中间件发送请求
关于如何修复这个问题,我将首先尝试弄清楚代码是如何抛出500错误的。您可以尝试在代码中插入一些调试/日志行。另一件事是在测试用例中插入这样一行:

$I->see responsecontains('blablabla')

当然,这将失败,但它将在tests/_output目录中生成一个输出,这样您就可以确切地看到代码返回的响应以及500错误(当然,您需要在测试200条件之前执行此步骤,否则您的测试将在该步骤中退出)

测试用例中此类错误的一个常见原因是对传入控制器方法的自定义请求类应用了验证。如果验证失败,那么控制器方法不会被命中,并且您将得到一个500错误,而无法在控制器中调试它。我认为这种类型的自定义请求类是一个坏主意。


另一种可能的查询方式是构建一个功能测试,测试相同的路径。通过Laravel5 helper模块进行的功能测试通常更容易工作和调试。一旦您有了一个基本的功能测试,并解决了您遇到的任何问题,那么就可以更容易地让API测试工作。

感谢您的精彩见解。所以我继续,这次将POST请求更改为
/api/authenticate
。因此,我深入研究了测试的输出。我发现一个检查令牌以评估有效负载的中间件把事情搞砸了,但是中间件不应该对
/api/authenticate
起作用,原因很明显。但是,当我从内核评论中间件时,它运行良好。如何解决此问题?请将其放入您的api.suite.yml:config:Laravel5:environment\u文件中:.env.testing在您的文件中。env.testing,请确保已设置:APP\u env=testing,否则它应与您的.env文件相同。默认情况下,当APP_ENV=测试中间件未运行时。你可以在个案的基础上重新启用它,但这应该可以解决你的问题。我不确定我是否了解全部情况。我更改了配置文件,我甚至会编辑我的答案以包含这些更改。我创建了.env.testing并将
APP\u env
设置为testing。但我不明白你说的中间件是什么意思。测试仍然失败。试图解析不应该解析的令牌的中间件。一旦我在内核中对中间件进行了注释,它就通过了,但这不是我想要解决的问题。中间件查看请求是否为
api/authenticate
,然后跳过。可能codeception没有执行HTTP请求?它用另一种方式实现。我很困惑。我在REST依赖项中将Laravel5更改为PhpBrowser。Laravel5模块没有模拟真实的HTTP请求,这就是中间件没有正确运行的原因。PhpBrowser显然模拟了真实的HTTP请求。请用这些信息更新答案,我会接受的。谢谢您提供的其他信息。:)好的,请注意——在某些情况下,如果默认情况下不希望启用中间件,则最好使用Laravel5模块。您始终可以专门为任何给定的测试启用或禁用中间件。