在内存中sqlite尽管设置仍然是空的

时间:2017-01-27 11:06:04

标签: sqlite symfony doctrine phpunit functional-testing

我遵循了网站点Testing Symfony Apps with a Disposable Database教程。 我在我的测试用例中添加了Fixtures,并且在SetUp期间没有出现错误。如果我在灯具中添加错误(例如,将nullable = false字段留空),则会显示错误,因此此代码肯定会被执行。

我的配置:

doctrine:
    dbal:
        default_connection: memory
        connections:
            memory:
                driver: pdo_sqlite
                memory: true
                charset: UTF8

我的WebTestCase中的SetUp:

protected function setUp() {
    parent::setUp();
    self::bootKernel();
    DatabasePrimer::prime(self::$kernel);
    $this->loadFixtures([
        'AppBundle\DataFixtures\ORM\UserData',
        'AppBundle\DataFixtures\ORM\ArtistData'
    ]);
}

然而,在我的WebTestCase中,似乎没有表存在。 输出抛出一个Doctrine异常,说我的表不存在。

SQLSTATE[HY000]: General error: 1 no such table: my_user_table

如果我在文件中切换到sql_lite,一切正常,没有任何其他更改:

dbal:
    default_connection: file
    connections:
        file:
            driver:   pdo_sqlite
            path:     %kernel.cache_dir%/test.db
            charset: UTF8

任何人都有成功使用上述教程或使用sqlite内存数据库进行单元测试并有任何提示或想法?

更新 我将我的安装程序更改为此以确保内核不会在其间关闭。它没有帮助:

parent::setUp();
$this->client = $this->getClient();
MemoryDbPrimer::prime(self::$kernel);
$this->loadFixtures([
    'AppBundle\DataFixtures\ORM\UserData',
    'AppBundle\DataFixtures\ORM\ArtistData'
]);

2 个答案:

答案 0 :(得分:4)

当你

$client->request(<METHOD>, <URL>);

调用

Symfony\Bundle\FrameworkBundleClient::doRequest($request)

请求后,内核默认关闭,内存数据库被删除。

如果你打电话

client->disableReboot(); 

在你的测试的setup()函数中,这将禁用行为,你可以运行整个套件。

答案 1 :(得分:1)

我假设你在测试函数中调用了createClient()createClient()执行的第一件事就是调用static::bootKernel()。这基本上意味着您在setUp()中引导的内核将被关闭并引导新内核,并使用内存SQLite数据库的新实例。

您可以将createClient()来电转移到setUp(),替换bootKernel(),以避免这种情况:

class MyTest extends WebTestCase
{
    private $client = null;

    public function setUp()
    {
        $this->client = static::createClient();
        // prime database
    }

    public function testSomething()
    {
        $crawler = $this->client->request('GET', '/');
        // ...
    }
}