Laravel 5 在不重置数据库的情况下使用 phpUnit 进行测试
Laravel 5 Testing with phpUnit without reset my database
有没有办法制作一个 setUp() 和 tearDown() 方法来告诉 laravel 类似于 "make all of this insertions in Database, but when you finish all the tests, delete all insertions without reset the database"
我需要做这样的测试:
/** @test */
public function testRegistration(){
$account = [
'name' => 'test',
'email' => 'test@gmail.com',
'password' => '123451234'
];
$this->visit('/register')
->type($account['name'],'name')
->type($account['email'],'email')
->type($account['password'],'password')
->type($account['password'],'password_confirmation')
->press('Register')
->seePageIs('/home');
}
起初,我可以 运行 phpunit
它会起作用,如果我再次 运行,当然它 returns 一个错误告诉我我不能使用这封电子邮件是因为已经在数据库中。
问题是我无法简单地重置我的数据库,我已经在我的数据库中插入了 12.000 行并且我无法创建 test_database 因为我需要将这 12.000 行插入到我的应用程序中才有意义。
我还没有找到任何我可以使用的信息,我能找到的只有 "make your test call migration::refresh and send 4 minutes to populate your table again",但我相信可以找到更好的解决方案!
此外,我应该将 setUp() 方法放在哪里以及在哪里调用它?
谢谢。
请参阅 this and this documentation(处理事务)。
This trait will only wrap the default database connection in a transaction.
换句话说,插入将是 "faked",因此您不需要每次都将其删除。
另一种选择是添加另一个测试,您可以在其中删除您所做的每个插入。
User::where('name', 'test')->where('email','test@gmail.com')->delete();
有没有办法制作一个 setUp() 和 tearDown() 方法来告诉 laravel 类似于 "make all of this insertions in Database, but when you finish all the tests, delete all insertions without reset the database"
我需要做这样的测试:
/** @test */
public function testRegistration(){
$account = [
'name' => 'test',
'email' => 'test@gmail.com',
'password' => '123451234'
];
$this->visit('/register')
->type($account['name'],'name')
->type($account['email'],'email')
->type($account['password'],'password')
->type($account['password'],'password_confirmation')
->press('Register')
->seePageIs('/home');
}
起初,我可以 运行 phpunit
它会起作用,如果我再次 运行,当然它 returns 一个错误告诉我我不能使用这封电子邮件是因为已经在数据库中。
问题是我无法简单地重置我的数据库,我已经在我的数据库中插入了 12.000 行并且我无法创建 test_database 因为我需要将这 12.000 行插入到我的应用程序中才有意义。
我还没有找到任何我可以使用的信息,我能找到的只有 "make your test call migration::refresh and send 4 minutes to populate your table again",但我相信可以找到更好的解决方案!
此外,我应该将 setUp() 方法放在哪里以及在哪里调用它?
谢谢。
请参阅 this and this documentation(处理事务)。
This trait will only wrap the default database connection in a transaction.
换句话说,插入将是 "faked",因此您不需要每次都将其删除。
另一种选择是添加另一个测试,您可以在其中删除您所做的每个插入。
User::where('name', 'test')->where('email','test@gmail.com')->delete();