Codeception Tests采用'default'数据源而不是CakePHP 3中的'test'



我可以通过Codeception运行UnitTest,但当涉及到数据库和固定装置时,它会令人困惑。。。

我的密码dist.yml

namespace: AppTestSuiteCodeception
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:
- CodeceptionExtensionRunFailed
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 AppTestUnitModelBehavior;
use AppModelBehaviorHashableBehavior;
use AppModelEntityUser;
use CakeORMTableRegistry;
use CakeDatasourceConnectionManager;
use CakeTestSuiteTestCase;
/**
* AppModelBehaviorHashableBehavior Test Case
*/
class HashableBehaviorTest extends CodeceptionTestUnit
{
/**
* Test subject
*
* @var AppModelBehaviorHashableBehavior
*/
public $Hashable;
public $fixtures = [
'app.Users',
'app.mandators'
];
/**
* Test subject
*
* @var AppModelTableUsersTable
*/
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&quoteIdentifiers=false&persistent=false"

变量DATABASE_TEST_URL在.env中,但对此没有影响。。。我认为cakeHP和Codeception并没有神奇地很好地集成。

我的fixture仍然没有加载到UnitTests(类MyTest扩展\Codeception\Test\Unit(中,但问题已经解决。

[UPDATE]固定夹具加载。我必须手动注入FixtureManager并在setUp函数中加载我的fxtures。

最新更新