CakePHP 3.x UnitTest“未找到基表或视图”

时间:2016-02-22 16:00:06

标签: mysql cakephp cakephp-3.x

我在CakePHP 3.2中的UnitTest中收到错误消息,官方文档对我不再有帮助。我认为错误与我尝试使用的SQL-Joins有关。

错误消息如下:

private void control_MouseDown(object sender, MouseEventArgs e)
{
    var control = sender as Control;
    this.DoDragDrop(control.Name, DragDropEffects.Move);
}

private void panel_DragEnter(object sender, DragEventArgs e)
{
    if (!e.Data.GetDataPresent(typeof(string)))
        return;

    var name = e.Data.GetData(typeof(string)) as string;
    var control = this.Controls.Find(name, true).FirstOrDefault();
    if (control != null)
    {
        e.Effect = DragDropEffects.Move;
    }
}

private void panel_DragDrop(object sender, DragEventArgs e)
{
    if (!e.Data.GetDataPresent(typeof(string)))
        return;

    var name = e.Data.GetData(typeof(string)) as string;
    var control = this.Controls.Find(name, true).FirstOrDefault();
    if (control != null)
    {
        control.Parent.Controls.Remove(control);
        var panel = sender as FlowLayoutPanel;
        ((FlowLayoutPanel)sender).Controls.Add(control);
    }
}

在我的测试类`1) App\Test\TestCase\Controller\GetContentControllerTest::testIndex PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'contentmapper_test.CmDeviceclasses' doesn't exist` 中,我加载了我需要的灯具,并在开始时创建了我的数据库表:

GetContentControllerTest

`public $fixtures = [ 'app.cm_content_options', 'app.cm_content_addresses', 'app.cm_deviceclasses', 'app.cm_properties' ];` - 方法我加载主表:

setUp()

我的测试方法`public function setUp() { parent::setUp(); $this->CmContentOptions = TableRegistry::get('CmContentOptions'); }` 如下所示:

testIndex()

public function testIndex() { //find the belonging ContentOption to address data //submitted by the client $this->testFindAllByUriAndDeviceclassAndBoxId(); assert($this->arrObjContentOptions->count() == 1); } 看起来如下图所示(编辑器无法正确打印):

e.Data

很难描述整个语境;我希望有可能理解。

错误恰好发生在图像中显示的语句中:

testFindAllByUriAandDeviceclassAndBoxID()

我想我只是忘了在$result = $query->toArray()方法或其他类似内容中添加的内容。

我希望任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:0)

您的联接设置不正确,您正在混淆别名和表名。

别名是连接数组的键,table键应该包含实际的数据库表名,而不是表类名。

鉴于您正在遵循数据库表名的CakePHP命名约定,您的连接设置应该更像这样

[
    'CmDeviceclasses' => [ /* < this is the SQL alias */
        'table' => 'cm_deviceclasses', /* < this is the database table name */
        'type' => 'LEFT',
        'conditions' => [
            'CmDeviceclasses.classname' => $this->deviceclass
        ]
    ],
    'CmContentAddresses' => [
        'table' => 'cm_content_addresses',
        'type' => 'INNER',
        'conditions' => [
            'CmContentAddresses.uri' => $this->uri,
            'CmContentAddresses.boxid' => $this->boxid,
        ]
    ],
],
[
    'CmDeviceclasses.classname' => 'string',
    'CmContentAddresses.uri' => 'string',
    'CmContentAddresses.boxid' => 'string'
]

对于别名,没有技术上需要遵循CamelCase约定,但是一般来说,遵守约定并不会造成伤害。

ps,如果你正确设置了关联,那么就不需要使用手动连接,只需使用Query::contain()Query::innerJoinWith()Query::matching()