如何使用Codeception来测试laravel 5 API?

时间:2015-11-02 10:11:08

标签: php laravel laravel-5 codeception

我是Codeception的新手,我正在尝试测试我使用Laravel 5构建的Web服务。我正在关注指南here

所以我创建了一个名为api的套件:

codecept generate:suite api

api.suite.yml

class_name: ApiTester
modules:
    enabled:
        - REST:
            url: http://localhost:8000/api/
            depends: Laravel5

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();

我已经使用Postman尝试了这个并且运行正常。 /authenticate路由获取3个参数并愉快地吐出JWT令牌,但我无法使其与Codeception一起使用。

1) Failed to authenticate a user in AuthenticateUserCept (tests/api//AuthenticateUserCept.php)

 Step  I see response code is 200
 Fail  Failed asserting that 500 matches expected 200.

Scenario Steps:

 3. $I->seeResponseCodeIs(200)
 2. $I->sendPOST("/authenticate",{"username":"archive","email":"admin@admin.com","password":"password"})
 1. $I->haveHttpHeader("Content-Type","application/x-www-form-urlencoded")

我哪里错了?而且我仍然很模糊我如何重构这个特定的测试,以便为我做的其他请求有一个JWT。任何帮助表示赞赏。

api.suite.yml中的EDIT更改

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

1 个答案:

答案 0 :(得分:0)

在我回答之前,有些评论:

  • 在api.suite.yml的启用行中我包括:enabled:[PhpBrowser,REST,ApiHelper,Asserts]。
  • REST行中的URL对API套件没有任何影响,它通常仅用于接受套件。这应该通过路由直接进入你的代码,而不是使用phpbrowser模式或类似的地方进行HTTP调用。
  • 您可以使用Laravel5模式而不是使用PhraBrowser模式 - 前者将通过中间件发送请求,如果APP_ENV设置为测试,则Laravel5模式不会通过中间件发出请求。

就如何解决这个问题而言,我首先想弄清楚代码正在做什么来吐出500错误。您可能要做的一件事是尝试在代码中插入一些调试/日志行。另一件事是将这样的行放入测试用例:

$ I-&GT; seeResponseContains(&#39; blablabla&#39);

当然会失败,但它会在tests / _output目录中产生一个输出,这样你就可以准确地看到代码给出的响应以及500错误(当然你需要在测试之前执行此步骤对于200条件,否则你的测试将在该步骤中挽救。)

测试用例中此类错误的一个常见原因是验证应用于传递给控制器​​方法的自定义Request类。如果验证失败,则控制器方法不会被命中,您将得到500错误而无法在控制器中调试它。我认为这种类型的自定义Request类是个坏主意。

另一个可能的探究线是构建一个测试相同路线的功能测试。通过Laravel5辅助模块进行的功能测试通常更容易实现并进行调试。一旦你进行了基本的功能测试并解决了你遇到的任何问题,那么API测试的工作就会更容易。