php - 从单元测试运行时,Laravel Schema::create 忽略表前缀

标签 php unit-testing laravel laravel-4

我有一个 正在运行播种机的单元测试 我已经构建以创建我的一个类的新实例。当我从 Artisan 运行播种机时,它运行没有问题。但是,当单元测试这样做时:

class MyClassTest extends TestCase {
    public function setUp() {
        // Setup application
        parent::setUp();

        $this->seed('MyClassSeeder');
    }

... 运行以下位 拒绝使用前缀 !

class MyClass extends Base {
    // Switch to the proper DB prefix
    protected function prefix() {
        DB::connection('main')->setTablePrefix($this->id . '_');
        return $this;
    }

    // This is run by the seeder, everything up to here works fine...
    public function setupDatabase() {
        $this->prefix();

        // This returns "1001_", which is correct
        Log::info(Schema::connection('main')->getConnection()->getTablePrefix());

        // Creates "myTable" instead of "1001_myTable"
        if(!Schema::connection('main')->hasTable('myTable')) {
             Schema::connection('main')->create('myTable', function($table) {
             ...

当我手动运行它时它工作正常,我什至不确定从哪里开始寻找。它甚至返回正确的前缀,只是不使用它。有没有其他人看到这个?它是可复制的吗?测试环境(由单元测试自动使用)是否关闭了过滤器以外的其他东西,我已经重新启用了它?

任何帮助,将不胜感激。即使是复制品也至少会告诉我这不是我们的代码。我们已经扩展了很多,但是在我们的安装中 Laravel 代码库应该没有重大变化。

进一步测试

所以我继续我的测试,发现似乎是一个错误,尽管我会进一步研究它,我将它张贴在这里,以防它为类似的问题唤起任何人的内存:

我修改了

Log::info(Schema::connection('main')->getConnection()->getTablePrefix());

成为

Log::info('Grammar Prefix: ' . Schema::connection('promotion')->getConnection()->getSchemaGrammar()->getTablePrefix());
Log::info('Connection Prefix: ' . Schema::connection('promotion')->getConnection()->getTablePrefix());

并发现虽然 Connection Prefix 行像以前一样正常工作,但 Grammar's Prefix 是不存在的。 语法和连接前缀不匹配。 虽然我可以解决这个问题,但我想知道为什么当我以任何方式运行它而不是通过单元测试类时它保持一致,但这里有一个不匹配。如果其他人以这种方式出现,将很快将其报告为错误。

最终测试

据我所知,代码应该从它的数据库配置文件中获取初始设置,然后蓝图和架构都应该在行时使用更新的前缀

DB::connection('promotion')->setTablePrefix($this->id . '_');

正在运行。我也通过运行线路解决了这个问题

DB::connection('promotion')->getSchemaGrammar()->setTablePrefix($this->id . '_');

这似乎解决了这个问题。这不应该是必要的,而且我认为我使用的代码没有理由不应该具有预期的效果。我认为这是一个错误,并将在今天晚些时候报告。如果我遗漏了一些东西,我会暂时保留这个问题,但我很快就会关闭它。

最佳答案

我得出的结论是这是一个错误。没有解释为什么它可以在一个环境中工作而不是在另一个环境中工作,除非测试正在做与默认环境不同的事情,而我找不到它。

关于php - 从单元测试运行时,Laravel Schema::create 忽略表前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302391/

相关文章:

php - 播放视频 - 服务器配置不正确 - 12939

PHP 5.3.6 和 PHP 5.3.8 源代码兼容性

Scalamock 3.模拟无参重载方法

laravel - 在 Laravel 5.4 中从 URL 中删除 '/public' 的安全方法

PHP 和 MySQL 过滤多个表

PHP 在 MySQL 查询中随机删除变量

java - 在 Java 中比较两个相似的 XML 数据与无序元素/属性

c# - ExpectedException 属性不起作用

laravel - 如何测试监听器发送的 Laravel 通知?

php - Laravel - leftJoin 和元素引用