我尝试了很多东西,但我坚持这个问题。 我尝试对我的应用程序进行测试(使用Laravel5.3)。 我的开发数据库是Mysql,但我想用sqlite“内存”数据库进行测试。
每次我尝试启动测试时都会出现此错误: 一般错误:1没有这样的表:groupe_user
它似乎没有在sqlite数据库中迁移表。 我不明白我做错了什么。
如果有人可以帮助我,我会把我的testCase文件和迁移放在这里,这会很棒。
TestCase.php:
<?php
abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
{
/**
* The base URL to use while testing the application.
*
* @var string
*/
protected $baseUrl = 'http://localhost';
/**
* Creates the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
$unitTesting = true;
$testEnvironment = 'testing';
$app = require __DIR__.'/../bootstrap/app.php';
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
}
public function setUp()
{
parent::setUp();
$this->createApplication();
$this->prepareForTests();
}
private function prepareForTests()
{
Artisan::call('migrate');
Artisan::call('db:seed');
}
public function tearDown()
{
parent::tearDown();
}
}
带有该数据透视表的迁移文件:
class CreateGroupesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('groupes', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 100);
$table->timestamps();
});
//Création de la table pivot groupe_user avec les cléfs étrangères
Schema::create('groupe_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->integer('groupe_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('groupe_id')->references('id')->on('groupes');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('groupes');
}
}
感谢收看。
编辑: 我的AuthTest.php的开头
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\User;
class AuthTest extends TestCase
{
use DatabaseMigrations;
public function testAuthLogin()
{
$user = factory(App\User::class)->create();
//Test du login
$this->visit('/login')
->see('Se Connecter')
->type('lorem@gmail.com', 'email')
->type('lorem85', 'password')
->press('Se connecter');
}
答案 0 :(得分:1)
对于the official reference of Ver.5.3,对于Laravel 5.3或更早的版本(但在Laravel 5中),似乎在您的测试用例文件中,以下内容是必要的(我没有尝试过,但是从Ver.5.6;请参阅下文)。我的猜测是在类定义中use DatabaseMigrations;
是必不可少的。
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase {
use DatabaseMigrations;
// Your test statements.
}
对于Laravel 5.4和更高版本(请参见the official reference of Ver.5.6),以下工作对我而言有效,并且在DB_DATABASE
文件中将:memory:
设置为“ phpunit.xml
”:>
use Illuminate\Foundation\Testing\RefreshDatabase;
class ExampleTest extends TestCase {
use RefreshDatabase;
// Your test statements.
}
无论哪种方式,迁移都必须在空数据库中正常进行,以为您的应用程序创建空表(或者至少对于单元测试脚本而言足够好)。
答案 1 :(得分:0)
如果要测试数据库事务,则必须使用Traits in your testcase。
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
答案 2 :(得分:0)
您是否在phpunit.xml文件中设置了sqlite数据库信息?
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php>