我有一个 正在运行播种机的单元测试 我已经构建以创建我的一个类的新实例。当我从 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/