我对单元测试还比较新,但已经阅读过phpunit.de的所有文档(直到第10章)。
文档指出,使用数据库进行测试可能会很慢,但如果正确设置,它可以像非数据库测试一样快。
因此,我想在Laravel中测试一个模型。我创建了一个模型工厂来向数据库中添加数据。
我也创建了一个基本测试。
在PHPUnits文档中,它指出每个测试之前都会调用setUp()
方法来设置测试。还有另一个静态方法setUpBeforeClass()
。
我想只在数据库表种子数据一次,并在我的测试中使用记录。所以我使用Laravel的factory()
函数在setUpBeforeClass()
方法中向数据库种子数据。
这是我的代码:
class CommentTest extends TestCase
{
protected static $blog;
protected static $comments;
public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$blog = factory(App\Models\Content\Blog::class)->create();
self::$comments = factory(App\Models\Content\Comment::class, 6)->create();
}
public function testSomething()
{
$this->assertTrue(true);
}
}
然而,当我运行phpunit
时,我会得到以下错误:
Fatal error: Call to a member function make() on a non-object in \vendor\laravel\framework\src\Illuminate\Foundation\helpers.php on line 54
Call Stack:
0.0002 240752 1. {main}() \vendor\phpunit\phpunit\phpunit:0
0.0173 1168632 2. PHPUnit_TextUI_Command::main() \vendor\phpunit\phpunit\phpunit:47
0.0173 1175304 3. PHPUnit_TextUI_Command->run() \vendor\phpunit\phpunit\src\TextUI\Command.php:100
2.9397 5869416 4. PHPUnit_TextUI_TestRunner->doRun() \vendor\phpunit\phpunit\src\TextUI\Command.php:149
2.9447 6077272 5. PHPUnit_Framework_TestSuite->run() \vendor\phpunit\phpunit\src\TextUI\TestRunner.php:440
2.9459 6092880 6. PHPUnit_Framework_TestSuite->run() \vendor\phpunit\phpunit\src\Framework\TestSuite.php:747
2.9555 6096160 7. call_user_func:{\vendor\phpunit\phpunit\src\Framework\TestSuite.php:697}() \vendor\phpunit\phpunit\src\Framework\TestSuite.php:697
2.9555 6096272 8. CommentTest::setUpBeforeClass() \vendor\phpunit\phpunit\src\Framework\TestSuite.php:697
2.9555 6096480 9. factory() \tests\CommentTest.php:18
2.9556 6096656 10. app() \vendor\laravel\framework\src\Illuminate\Foundation\helpers.php:350
如果我将代码从setUpBeforeClass()
移动到setUp()
并运行它,它会按预期工作,但这显然效率低下,因为它为每个测试都提供了种子数据库。
我的问题:
- 是否在
setUpBeforeClass()
中设置数据库是正确的方式? - 如果是(问题1),那么为什么我在运行phpunit时会出现致命错误?在调用
factory()
之前是否需要做任何事情? - 如果我确实必须将代码放在
setUp()
方法中,那么会有性能问题吗? - 我是否应该从
setUpBeforeClass()
或setUp()
方法种子?在Laravel文档中,示例显示种子是在测试本身中发生的,但如果我运行100个测试(例如),是否多次播种是一个好主意?