在插件中使用不同表名的Cakephp Fixture

在插件中使用不同表名的Cakephp Fixture,cakephp,phpunit,fixtures,Cakephp,Phpunit,Fixtures,我是CakePHP测试新手,现在正在创建一个新插件,希望为它创建单元测试 新插件“MyPlugin”连接到多个数据库,其中一个数据库与不遵循cake命名标准的none-cake应用程序(迁移到cake)共享 我想创建的第一个测试是从“AppApiKey”表中获取一些数据,但是数据库中的名称都是小写,没有“u”,所以是“AppApiKey”而不是“app_api_key” 在名为“AppApiKeyFixture”的插件中创建了一个装置 namespace MyPlugin\Test\Fixtur

我是CakePHP测试新手,现在正在创建一个新插件,希望为它创建单元测试

新插件“MyPlugin”连接到多个数据库,其中一个数据库与不遵循cake命名标准的none-cake应用程序(迁移到cake)共享

我想创建的第一个测试是从“AppApiKey”表中获取一些数据,但是数据库中的名称都是小写,没有“u”,所以是“AppApiKey”而不是“app_api_key”

在名为“AppApiKeyFixture”的插件中创建了一个装置

namespace MyPlugin\Test\Fixture;

use Cake\TestSuite\Fixture\TestFixture;

class AppApiKeyFixture extends TestFixture {
    public $connection = 'test_ctrller';
    public $table = 'appapikey';

    //public $import = [ 'table' => 'appapikey', 'connection' => 'ctrller' ];
    public $fields = [
        'id' => ['type' => 'string'],
        'key' => ['type' => 'string' ],
        'label' => 'text',
        'creationdstamp' => 'datetime',
        '_constraints' => [
            'primary' => ['type' => 'primary', 'columns' => ['id']]
        ]
    ];

    public $records = [ 
        [
            'id' => '03380d5b-1b05-467a-af32-ca8aecb4dcc6',
            'key' => '53b4359a-a7d9-d6d7-9853-e569f408eae9',
            'label' => 'MyLabel',
            'creationdstamp' => '2019-11-12 15:53:48.176576+00'
        ] 
    ];
}
我一直在尝试一些事情,似乎无论您是否使用导入,都会进行描述(那么为什么存在$fields?)

填写“$字段”和“$记录”。据我从文件和经验中了解:

  • 使用原始连接进行描述
  • 将创建一个“test\u xxx”表,并将其填入“test”/“test\u xxx”连接中
  • 测试在测试(_xxx)连接的表(+$records data)上运行
  • 但是上面的固定装置给了我

    Cake\Database\Exception:无法描述应用程序api\U密钥。它有0列

    是否需要其他地方的“$table=xxx”?在文档中看不到

    无论“$table”或“$import”填写了什么,这种情况都会持续发生

    在应用程序本身中,该表类起作用:

    namespace MyPlugin\Model\Table;
    
    use Cake\ORM\Table;
    
    class AppApiKeyTable extends Table { 
        public function initialize(array $config) {
            parent::initialize($config);
            $this->setTable('appapikey');
        }
    
        public static function defaultConnectionName() {
            return 'ctrller';
        }
    }
    
    TestCase调用我想要测试的函数:

    namespace MyPlugin\Auth\ApiKey;
    
    use Cake\ORM\TableRegistry;
    
    class ApiKeyAuthenticator {
        public function getApiKeyInfo($pKey) {
            return TableRegistry::getTableLocator()->get('AppApiKey')->findByKey($pKey)->first();
        }
    }
    
    此外,我还发现,在另一个装置中,我不得不使用“$import”,如果没有它,我也会得到一个:

    Cake\Database\Exception:无法描述softwareid。它有0列

    固定装置为:

    namespace MyPlugin\Test\Fixture;
    
    use Cake\TestSuite\Fixture\TestFixture;
    
    class SoftwareidFixture extends TestFixture {
        //public $import = [ 'table' => 'softwareid', 'connection' => 'default' ];
        public $fields = [
            'id' => ['type' => 'string'],
            'softwareid' => ['type' => 'string' ],
            'name' => 'text',
            'created' => 'datetime',
            '_constraints' => [
                'primary' => ['type' => 'primary', 'columns' => ['id']]
            ]
        ];
    
        public $records = [ 
            [
                'id' => '5e26b612-2b74-40ed-aaa5-b48cb4b1d946',
                'softwareid' => '228ebfe2-4a2b-49ec-ab75-43f44007b68d',
                'name' => 'MySoftwarePackage',
                'created' => '2019-10-31 12:08:10+00'
            ] 
        ];
    }
    

    上面是默认连接中的一个表,“$fields”和“$records”应该足够了吧?不需要定义“$import”

    所以导入时两个表都可以使用,在我的情况下,这是一个很好的修复,因为一旦迁移完成(长期项目),将有70到100个表

    简单的方法是定义模型,它在文档中,但我却盲目地盯着文档中提到的“$table”、“$connection”和“$fields”

    因此,固定装置以:

    namespace MyPlugin\Test\Fixture;
    
    use Cake\TestSuite\Fixture\TestFixture;
    
    class AppApiKeyFixture extends TestFixture {
        public $import = [ 'model' => 'AppApiKey', 'connection' => 'ctrller' ];
        public $records = [ 
            [
                'id' => '03380d5b-1b05-467a-af32-ca8aecb4dcc6',
                'key' => '53b4359a-a7d9-d6d7-9853-e569f408eae9',
                'label' => 'MyLabel',
                'creationdstamp' => '2019-11-12 15:53:48.176576+00'
            ] 
        ];
    }
    
    对于那些在使用不同的表名和连接进行unittests时遇到问题的人来说,引用模型似乎是一种方法