Laravel Schema ::从Unit Test运行时创建忽略表前缀

时间:2014-04-25 20:26:00

标签: 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行像以前一样正常工作,但语法的前缀不存在。 语法和连接前缀不匹配。虽然我可以解决这个问题,但我想知道为什么当我以除了通过单元测试类之外的任何方式运行它时它保持一致,但是这里有一个不匹配的地方。如果它以任何其他方式显示,将很快报告为错误。

最终测试

据我所知,代码应该从它的数据库配置文件中获取初始设置,然后Blueprint和Schema应该在行

时使用更新的前缀
DB::connection('promotion')->setTablePrefix($this->id . '_');

正在运行。我也通过运行

来解决这个问题
DB::connection('promotion')->getSchemaGrammar()->setTablePrefix($this->id . '_');

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

PHPUnit并没有改变Laravel与数据库交互的方式。当您运行任何environment configuration

的测试时,请确保不会覆盖您的配置

还要确保您正在设置和使用相同的连接。在您提供的代码中,您要设置连接promotion的前缀,但您使用的是连接main 这是一个有效的例子,我试着让它和你的一样。

<强> TestSeedTest.php

<?php

class TestSeedTest extends TestCase{

   public function setUp() {
        // Setup application
        parent::setUp();


    }

    public function testSeeder(){

        $this->seed('MyClassSeeder');

    }

}
?>

<强> MyClassSeeder.php

<?php

class MyClassSeeder extends Seeder {

    private $id='123';

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->setupDatabase();

    }

    protected function prefix() {

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

        return $this;
    }


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


        if(!Schema::connection('promotion')->hasTable('myTable')) {
             Schema::connection('promotion')->create('myTable', function($table) {

                $table->increments('id');
                $table->string('test');
                $table->timestamps();
            });
        }

    }

}