使用_before

时间:2015-05-11 07:18:41

标签: testing yii2 codeception

我使用Yii2作为我的应用框架,我开始使用高级模板。我的应用程序有一个前端,后端和api入口点。我已经将前端,后端和api从根目录移到/ modules中,以便在根目录中保持混乱。

我正在尝试为我的API注册端点创建注册测试。在我运行测试之前,我需要确保我测试注册的电子邮件地址尚未在测试数据库中注册。

我使用Cest _before方法查看是否可以找到包含测试电子邮件的成员模型,如果找到一个,则删除它。

问题是这导致测试在没有任何调试信息的情况下退出。

我应该如何进行测试设置?我应该做些什么来清除任何旧的测试用户。

如果删除_before()设置功能,测试将在我第一次运行时运行。

AuthenticationCest.php

 namespace tests\codeception\api\api;

use common\models\Member;
use tests\codeception\api\ApiTester;

class AuthenticationCest {

    public $email = "reg.test@member.com";

    //Check to see id the email is already used and delete it
    public function _before(ApiTester $I) {
        $member = Member::findOne([
            "email" => $this->email
        ]);

        if ($member) {
            $member->delete();
        }
    }

    //Test that a member can register
    public function registerTest(ApiTester $I) {
        $I->wantTo('Register a new member via the API');

        $I->haveHttpHeader('Content-Type', 'application/json');

        $I->sendPOST('token', [
            'grant_type'    => 'registration',
            'client_id'     => 'testclient',
            'client_secret' => 'testpass',
            'email'         => $this->email,
            'password'      => 'Test1234',
            'given_name'    => 'Test',
            'family_name'   => 'Member'
        ]);

        $I->seeResponseCodeIs(200);
        $I->seeResponseIsJson();
    }
}

_bootstrap.php

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');

defined('YII_APP_BASE_PATH') or define('YII_APP_BASE_PATH', dirname(dirname(dirname(__DIR__))));

require_once(YII_APP_BASE_PATH . '/vendor/autoload.php');
require_once(YII_APP_BASE_PATH . '/vendor/yiisoft/yii2/Yii.php');
require_once(YII_APP_BASE_PATH . '/common/config/bootstrap.php');
require_once(YII_APP_BASE_PATH . '/modules/api/config/bootstrap.php');

Yii::setAlias('@tests', dirname(dirname(__DIR__)));

这似乎足以让我创建和删除单元测试的模型,但不是功能API测试

api.suite.yml

class_name: ApiTester
modules:
enabled: [PhpBrowser, REST]
config:
  PhpBrowser:
      url: http://api.yii.lan/
  REST:
      url: http://api.yii.lan/v1/

编辑输出

$ ../vendor/bin/codecept run --steps --debug -vvv

Codeception PHP Testing Framework v2.0.13
Powered by PHPUnit 4.6.6 by Sebastian Bergmann and contributors.

[tests\codeception\common]: tests from /workspace/yii2/tests//codeception/common


Tests\codeception\api.api Tests (3) ------------------------------------------------------------------------
Modules: PhpBrowser, REST, Db
------------------------------------------------------------------------------------------------------------------------------------
Register via the API (tests\codeception\api\api\oauth\RegistrationCest::registerTest)
Scenario:

1 个答案:

答案 0 :(得分:0)

如果在每次测试后需要清除数据库,则需要使用Fixtures。 夹具是测试的重要部分。它们的主要目的是将环境设置为固定/已知状态,以便您的测试可重复并以预期方式运行。有关http://www.yiiframework.com/doc-2.0/guide-test-fixtures.html

的更多信息

阅读完文档后,您发现自己已经拥有了FixtureHelper,在高级模板中它应该位于/ tests / codeception / common / support / FixtureHelper中。

您应该在tests /.../ common / fixtures文件夹中生成名为MemberFixture.php的文件。之后你应该在数据库中生成数据(一些成员将成为测试人员的标准)。

在finall部分中,您应该将FixtureHelper添加到.yml文件(functional.yml)。例如,我的acceptance.yml看起来像

class_name: AcceptanceTester
modules:
enabled:
  - PhpBrowser
  - REST
  - ApiHelper
  - tests\codeception\common\_support\FixtureHelper
  - Db
config:
  PhpBrowser:
      url: http://localhost:8080
  REST:
      url: http://localhost:8080/frontend/web/index-test.php
  Db:
    dsn: 'mysql:host=localhost;dbname=y1db_test'
    user: 'newproject'
    password: 'newproject'
    populate: false,
    cleanup: false

多数,现在每次测试之后,您的会员表将被清理并填充来自灯具的标准具数据。测试将是绿色的。