【发布时间】:2016-02-18 15:40:27
【问题描述】:
我对单元测试还很陌生,但我已经阅读了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()方法播种?在 Laravels 文档中,它显示了在测试本身中进行播种的示例,但是如果我正在运行 100 个测试(例如),那么播种 100 次是个好主意吗?
【问题讨论】:
标签: php laravel phpunit laravel-5.1