eme*_*his 21 phpunit unit-testing cakephp cakephp-3.0
我在使用phpunit v5.1.3的CakePHP v3.x上.我的单元测试似乎没有认识到我的灯具的存在.看来测试是从local(default
)数据库连接读取的.
这是我的TestCase类:
namespace App\Test\TestCase\Model\Table;
use Cake\Datasource\ConnectionManager;
use Cake\I18n\Time;
use Cake\ORM\TableRegistry;
use Cake\TestSuite\TestCase;
/**
* App\Model\Table\ScreensTable Test Case
*
* @property \App\Model\Table\ScreensTable ScreensTable
*/
class ScreensTableTest extends TestCase
{
/**
* Fixtures
*
* @var array
*/
public $fixtures = [
'app.screens'
];
/**
* setUp method
*
* @return void
*/
public function setUp()
{
parent::setUp();
$config = TableRegistry::exists('Screens') ? [] : ['className' => 'App\Model\Table\ScreensTable'];
$this->Screens = TableRegistry::get('Screens', $config);
}
public testSomethingHere(){
$newScreen = $this->Screens->newEntity(['who' => 'cares']);
$screen = $this->Screens->save($newScreen);
// ^ This record will show up in my app's DB!
}
Run Code Online (Sandbox Code Playgroud)
这是我的夹具文件:
<?php
namespace App\Test\Fixture;
use App\TestSuite\Fixture\TestFixture;
/**
* ScreensFixture
*
*/
class ScreensFixture extends TestFixture
{
/**
* Records
*
* @var array
*/
public $records = [
[
'id' => 2,
'name' => 'Bla bla',
],
...
Run Code Online (Sandbox Code Playgroud)
当我debug()
从返回的值中$this->Screens->find('all')->order(['id'=>'ASC'])->first()
看到DB中的第一个REAL记录时.不是我的夹具.
我错过了什么?
UPDATE1: 这是我的配置文件中定义的连接:
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Postgres',
'persistent' => false,
'host' => 'localhost',
'port' => '5432',
'username' => 'postgres',
'password' => 'postgres',
'database' => 'transitscreen',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
],
/**
* Used by test suites
*/
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Postgres',
'persistent' => false,
'host' => 'localhost',
'port' => '5432',
'username' => 'postgres',
'password' => 'postgres',
'database' => 'ts_test',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
],
],
Run Code Online (Sandbox Code Playgroud)
更新
的内容App\Test\Fixture
(不要以为有什么有趣的事发生在这里...我认为这只是延长了蛋糕夹具类)
<?php
namespace App\TestSuite\Fixture;
use Cake\I18n\Time;
use Cake\TestSuite\Fixture\TestFixture as CoreTestFixture;
/**
* Override core TestFixture.
*/
class TestFixture extends CoreTestFixture
{
/**
* Initialize the fixture.
*
* @return void
* @throws \Cake\ORM\Exception\MissingTableClassException When importing from a table that does not exist.
*/
public function init()
{
$this->setRecordTimestamps();
$this->encodeJsonColumns();
parent::init();
}
/**
* Set record timestamps.
*
* - created
* - modified
*
* @return void
*/
public function setRecordTimestamps()
{
foreach (['created', 'modified'] as $timestampField) {
if (array_key_exists($timestampField, $this->fields)) {
foreach ($this->records as &$record) {
$record[$timestampField] = new Time();
}
}
}
}
/**
* Encode JSON columns.
*
* Bake will output JSON fields as arrays (because of the `JsonType` object mapped to this field) but since
* migrations execute directly against the database we need to encode these fields manually before insertion.
*
* @return void
*/
public function encodeJsonColumns()
{
$fixtureName = namespaceSplit(get_called_class())[1];
if ($fixtureName === 'DatasourcesFixture' && array_key_exists('widget_options', $this->fields)) {
foreach ($this->records as &$record) {
$record['widget_options'] = json_encode($record['widget_options']);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)