Codeception 测试采用 'default' 数据源而不是 CakePHP 3 中的 'test'
Codeception Tests take 'default' datasource instead of 'test' in CakePHP 3
我能够 运行 通过 Codeception 进行单元测试,但是当涉及到数据库和固定装置时,它令人困惑...
我的codeception.dist.yml
namespace: App\TestSuite\Codeception
paths:
tests: tests
output: tmp/tests
data: tests/Fixture
support: src/TestSuite/Codeception
envs: tests/Envs
settings:
bootstrap: bootstrap.php
colors: true
memory_limit: 1024M
actor_suffix: Tester
extensions:
enabled:
- Codeception\Extension\RunFailed
modules:
config:
Db:
dsn: 'mysql:host=%DB_HOST_TEST%;dbname=%DB_NAME_TEST%'
user: '%DB_USER_TEST%'
password: '%DB_PASSWORD_TEST%'
dump: tests/_data/dump.sql
cleanup: true # reload dump between tests
populate: true # load dump before all tests
reconnect: true
enabled:
- Db
params:
- env
dump.sql 在我的测试中 运行 被导入测试数据库。夹具未插入...
然后在我的测试中我做了这样的事情(缩短):
<?php
namespace App\Test\Unit\Model\Behavior;
use App\Model\Behavior\HashableBehavior;
use App\Model\Entity\User;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\TestSuite\TestCase;
/**
* App\Model\Behavior\HashableBehavior Test Case
*/
class HashableBehaviorTest extends \Codeception\Test\Unit
{
/**
* Test subject
*
* @var \App\Model\Behavior\HashableBehavior
*/
public $Hashable;
public $fixtures = [
'app.Users',
'app.mandators'
];
/**
* Test subject
*
* @var \App\Model\Table\UsersTable
*/
public $UsersTable;
/**
* setUp method
*
* @return void
*/
public function setUp()
{
parent::setUp();
$config = TableRegistry::getTableLocator()->exists('Users') ? [] : ['className' => UsersTable::class];
$this->UsersTable = TableRegistry::getTableLocator()->get('Users', $config);
$this->Hashable = new HashableBehavior($this->UsersTable);
}
/**
* tearDown method
*
* @return void
*/
public function tearDown()
{
unset($this->Hashable);
parent::tearDown();
}
/**
* Test beforeSave method
*
* @return void
* @throws \Exception
*/
public function testBeforeSave()
{
$user = $this->UsersTable->get(1);
...
}
这为我提供了默认数据库中的第一条记录,而不是测试数据库中的第一条记录。我不知道这里缺少什么...很高兴得到任何帮助!
再次检查所有代码后,我在 tests/bootstrap.php 中找到了这一行:
if (getenv('db_dsn')) {
putenv('DATABASE_URL=' . getenv('db_dsn'));
putenv('DATABASE_TEST_URL=' . getenv('db_dsn'));
}
即使我找不到使用变量 DATABASE_TEST_URL 的地方,将其添加到我的 .env 文件中也解决了它:
export db_dsn="mysql://db_usr:db_password@db_host/db_name?encoding=utf8&timezone=UTC&cacheMetadata=true"eIdentifiers=false&persistent=false"
变量 DATABASE_TEST_URL 在 .env 中,但对此没有影响...我认为是 cakePHP 和 Codeception 没有神奇地集成得太好。
我的固定装置仍然没有加载到 UnitTests(class MyTest extends \Codeception\Test\Unit)- 但问题已解决。
[更新] 夹具加载已修复。我必须手动注入 FixtureManager 并在 setUp 函数中加载我的 fxtures。
我能够 运行 通过 Codeception 进行单元测试,但是当涉及到数据库和固定装置时,它令人困惑...
我的codeception.dist.yml
namespace: App\TestSuite\Codeception
paths:
tests: tests
output: tmp/tests
data: tests/Fixture
support: src/TestSuite/Codeception
envs: tests/Envs
settings:
bootstrap: bootstrap.php
colors: true
memory_limit: 1024M
actor_suffix: Tester
extensions:
enabled:
- Codeception\Extension\RunFailed
modules:
config:
Db:
dsn: 'mysql:host=%DB_HOST_TEST%;dbname=%DB_NAME_TEST%'
user: '%DB_USER_TEST%'
password: '%DB_PASSWORD_TEST%'
dump: tests/_data/dump.sql
cleanup: true # reload dump between tests
populate: true # load dump before all tests
reconnect: true
enabled:
- Db
params:
- env
dump.sql 在我的测试中 运行 被导入测试数据库。夹具未插入...
然后在我的测试中我做了这样的事情(缩短):
<?php
namespace App\Test\Unit\Model\Behavior;
use App\Model\Behavior\HashableBehavior;
use App\Model\Entity\User;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\TestSuite\TestCase;
/**
* App\Model\Behavior\HashableBehavior Test Case
*/
class HashableBehaviorTest extends \Codeception\Test\Unit
{
/**
* Test subject
*
* @var \App\Model\Behavior\HashableBehavior
*/
public $Hashable;
public $fixtures = [
'app.Users',
'app.mandators'
];
/**
* Test subject
*
* @var \App\Model\Table\UsersTable
*/
public $UsersTable;
/**
* setUp method
*
* @return void
*/
public function setUp()
{
parent::setUp();
$config = TableRegistry::getTableLocator()->exists('Users') ? [] : ['className' => UsersTable::class];
$this->UsersTable = TableRegistry::getTableLocator()->get('Users', $config);
$this->Hashable = new HashableBehavior($this->UsersTable);
}
/**
* tearDown method
*
* @return void
*/
public function tearDown()
{
unset($this->Hashable);
parent::tearDown();
}
/**
* Test beforeSave method
*
* @return void
* @throws \Exception
*/
public function testBeforeSave()
{
$user = $this->UsersTable->get(1);
...
}
这为我提供了默认数据库中的第一条记录,而不是测试数据库中的第一条记录。我不知道这里缺少什么...很高兴得到任何帮助!
再次检查所有代码后,我在 tests/bootstrap.php 中找到了这一行:
if (getenv('db_dsn')) {
putenv('DATABASE_URL=' . getenv('db_dsn'));
putenv('DATABASE_TEST_URL=' . getenv('db_dsn'));
}
即使我找不到使用变量 DATABASE_TEST_URL 的地方,将其添加到我的 .env 文件中也解决了它:
export db_dsn="mysql://db_usr:db_password@db_host/db_name?encoding=utf8&timezone=UTC&cacheMetadata=true"eIdentifiers=false&persistent=false"
变量 DATABASE_TEST_URL 在 .env 中,但对此没有影响...我认为是 cakePHP 和 Codeception 没有神奇地集成得太好。
我的固定装置仍然没有加载到 UnitTests(class MyTest extends \Codeception\Test\Unit)- 但问题已解决。
[更新] 夹具加载已修复。我必须手动注入 FixtureManager 并在 setUp 函数中加载我的 fxtures。