如何从PHPUnit测试setUp运行Laravel数据库播种器?

时间:2017-01-22 12:14:46

标签: laravel laravel-5 phpunit laravel-seeding

我试图在一些PHPUnit测试用例中的每次测试之前重新创建数据库。我正在使用Laravel 5.3。这是TestCase:

class CourseTypesTest extends TestCase
{
    public function setUp()
    {
        parent::setUp();
        Artisan::call('migrate');
        Artisan::call('db:seed', ['--class' => 'TestDatabaseSeeder ', '--database' => 'testing']);
    }

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function test_list_course_types()
    {
        $httpRequest = $this->json('GET', '/api/course-types');
        $httpRequest->assertResponseOk();
        $httpRequest->seeJson();

    }

    public function tearDown()
    {
        Artisan::call('migrate:reset');
        parent::tearDown();
    }
}

正在运行phpunit失败,错误:

  

$ phpunit Sebastian Bergmann和贡献者的PHPUnit 5.7.5。

     

E 1 /   1(100%)

     

时间:2.19秒,内存:12.00MB

     

有1个错误:

     

1)CourseTypesTest :: test_list_course_types ReflectionException:Class   TestDatabaseSeeder不存在

     

d:\ WWW \学习-laravel \我的文件夹-API \厂商\ laravel \框架\ SRC \照亮\容器\ Container.php:749   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\集装箱\ Container.php:644   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\基金会\ Application.php:709   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\数据库\控制台\种子\ SeedCommand.php:74   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\数据库\控制台\种子\ SeedCommand.php:63   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\数据库\雄辩\ Model.php:2292   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\数据库\控制台\种子\ SeedCommand.php:64   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\集装箱\ Container.php:508   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\控制台\ Command.php:169   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ symfony的\控制台\ COMMAND \ Command.php:254   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\控制台\ Command.php:155   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ symfony的\控制台\ Application.php:821   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ symfony的\控制台\ Application.php:187   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ symfony的\控制台\ Application.php:118   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\控制台\ Application.php:107   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮\基金会\控制台\ Kernel.php:218   d:\ WWW \学习,laravel \我的文件夹-API \供应商\ laravel \框架的\ src \照亮的\ Support \外墙\ Facade.php:237   d:\ WWW \学习-laravel \我的文件夹-API \测试\其余\ CourseTypesTest.php:17

     

错误!测试:1,断言:0,错误:1。

但是这个类存在:
TestDatabaseSeeder inside database/seeds

3 个答案:

答案 0 :(得分:10)

问题是--class参数中的空格。如果仔细查看数组'--class' => 'TestDatabaseSeeder ',最后会有空间......这就是问题所在。将其更改为'--class' => 'TestDatabaseSeeder',它应该可以正常工作。

答案 1 :(得分:10)

DatabaseSeeder可以单独实例化,其call方法是公共的。

您需要在CourseTypesTest类中做的所有事情

(new DatabaseSeeder())->call(TestDatabaseSeeder::class);

或者您可以按照以下方式使用Laravel的app帮助程序

app(DatabaseSeeder::class)->call(TestDatabaseSeeder::class);

答案 2 :(得分:3)

从5.8版开始,您可以执行以下操作:

// Run the DatabaseSeeder...
$this->seed();

// Run a single seeder...
$this->seed(OrderStatusesTableSeeder::class);

Take a look at the documentation