Trait yii\test\FixtureTrait
实现于 | yii\console\controllers\FixtureController |
---|---|
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/test/FixtureTrait.php |
FixtureTrait 提供了用于加载、卸载和访问测试用例的 fixture 的功能。
通过使用 FixtureTrait,测试类将能够通过覆盖 fixtures() 方法来指定要加载哪些 fixture。然后,它可以使用 loadFixtures() 和 unloadFixtures() 加载和卸载 fixture。加载 fixture 后,由于 PHP 的 __get()
魔术方法,可以像访问对象属性一样访问它。此外,如果 fixture 是 yii\test\ActiveFixture 的实例,则可以通过语法 $this->fixtureName('model name')
访问 AR 模型。
有关 FixtureTrait 的更多详细信息和使用信息,请参阅 有关 fixture 的指南文章。
公共方法
方法 | 描述 | 定义于 |
---|---|---|
fixtures() | 声明当前测试用例所需的 fixture。 | yii\test\FixtureTrait |
getFixture() | 返回命名的 fixture。 | yii\test\FixtureTrait |
getFixtures() | 返回 globalFixtures() 和 fixtures() 中指定的 fixture 对象。 | yii\test\FixtureTrait |
globalFixtures() | 声明不同测试用例共享所需的 fixture。 | yii\test\FixtureTrait |
initFixtures() | 初始化 fixture。 | yii\test\FixtureTrait |
loadFixtures() | 加载指定的 fixture。 | yii\test\FixtureTrait |
unloadFixtures() | 卸载指定的 fixture。 | yii\test\FixtureTrait |
方法详情
创建指定的 fixture 实例。
所有依赖的 fixture 也将被创建。重复的 fixture 和循环依赖关系将只创建一次。
protected yii\test\Fixture[] createFixtures ( array $fixtures ) | ||
$fixtures | 数组 |
要创建的 fixture。您可以提供 fixture 名称或 fixture 配置。如果未提供此参数,则将创建 globalFixtures() 和 fixtures() 中指定的 fixture。 |
返回值 | yii\test\Fixture[] |
创建的 fixture 实例 |
---|---|---|
抛出 | yii\base\InvalidConfigException |
如果 fixture 未正确配置 |
protected function createFixtures(array $fixtures)
{
// normalize fixture configurations
$config = []; // configuration provided in test case
$aliases = []; // class name => alias or class name
foreach ($fixtures as $name => $fixture) {
if (!is_array($fixture)) {
$class = ltrim($fixture, '\\');
$fixtures[$name] = ['class' => $class];
$aliases[$class] = is_int($name) ? $class : $name;
} elseif (isset($fixture['class'])) {
$class = ltrim($fixture['class'], '\\');
$config[$class] = $fixture;
$aliases[$class] = $name;
} else {
throw new InvalidConfigException("You must specify 'class' for the fixture '$name'.");
}
}
// create fixture instances
$instances = [];
$stack = array_reverse($fixtures);
while (($fixture = array_pop($stack)) !== null) {
if ($fixture instanceof Fixture) {
$class = get_class($fixture);
$name = isset($aliases[$class]) ? $aliases[$class] : $class;
unset($instances[$name]); // unset so that the fixture is added to the last in the next line
$instances[$name] = $fixture;
} else {
$class = ltrim($fixture['class'], '\\');
$name = isset($aliases[$class]) ? $aliases[$class] : $class;
if (!isset($instances[$name])) {
$instances[$name] = false;
$stack[] = $fixture = Yii::createObject($fixture);
foreach ($fixture->depends as $dep) {
// need to use the configuration provided in test case
$stack[] = isset($config[$dep]) ? $config[$dep] : ['class' => $dep];
}
}
// if the fixture is already loaded (ie. a circular dependency or if two fixtures depend on the same fixture) just skip it.
}
}
return $instances;
}
声明当前测试用例所需的 fixture。
此方法的返回值必须是 fixture 配置的数组。例如,
[
// anonymous fixture
PostFixture::class,
// "users" fixture
'users' => UserFixture::class,
// "cache" fixture with configuration
'cache' => [
'class' => CacheFixture::class,
'host' => 'xxx',
],
]
请注意,用于测试用例的实际 fixture 将包括 globalFixtures() 和 fixtures()。
public array fixtures ( ) | ||
返回值 | 数组 |
当前测试用例所需的 fixture |
---|
public function fixtures()
{
return [];
}
返回命名的 fixture。
public yii\test\Fixture|null getFixture ( $name ) | ||
$name | 字符串 |
fixture 名称。这可以是 fixture 别名,或者如果未使用别名则为类名。 |
返回值 | yii\test\Fixture|null |
fixture 对象,如果指定的 fixture 不存在则为 null。 |
---|
public function getFixture($name)
{
if ($this->_fixtures === null) {
$this->_fixtures = $this->createFixtures(array_merge($this->globalFixtures(), $this->fixtures()));
}
$name = ltrim($name, '\\');
return isset($this->_fixtures[$name]) ? $this->_fixtures[$name] : null;
}
返回 globalFixtures() 和 fixtures() 中指定的 fixture 对象。
public yii\test\Fixture[] getFixtures ( ) | ||
返回值 | yii\test\Fixture[] |
当前测试用例的已加载 fixture |
---|
public function getFixtures()
{
if ($this->_fixtures === null) {
$this->_fixtures = $this->createFixtures(array_merge($this->globalFixtures(), $this->fixtures()));
}
return $this->_fixtures;
}
public array globalFixtures ( ) | ||
返回值 | 数组 |
不同测试用例共享和所需的 fixture。 |
---|
public function globalFixtures()
{
return [];
}
初始化 fixture。
public void initFixtures ( ) |
public function initFixtures()
{
$this->unloadFixtures();
$this->loadFixtures();
}
加载指定的 fixture。
此方法将为每个 fixture 对象调用 yii\test\Fixture::load()。
public void loadFixtures ( $fixtures = null ) | ||
$fixtures | yii\test\Fixture[]|null |
要加载的 fixtures。如果未指定此参数,则将使用 getFixtures() 的返回值。 |
public function loadFixtures($fixtures = null)
{
if ($fixtures === null) {
$fixtures = $this->getFixtures();
}
/* @var $fixture Fixture */
foreach ($fixtures as $fixture) {
$fixture->beforeLoad();
}
foreach ($fixtures as $fixture) {
$fixture->load();
}
foreach (array_reverse($fixtures) as $fixture) {
$fixture->afterLoad();
}
}
卸载指定的 fixture。
此方法将为每个 fixture 对象调用 yii\test\Fixture::unload()。
public void unloadFixtures ( $fixtures = null ) | ||
$fixtures | yii\test\Fixture[]|null |
要加载的 fixtures。如果未指定此参数,则将使用 getFixtures() 的返回值。 |
public function unloadFixtures($fixtures = null)
{
if ($fixtures === null) {
$fixtures = $this->getFixtures();
}
/* @var $fixture Fixture */
foreach ($fixtures as $fixture) {
$fixture->beforeUnload();
}
$fixtures = array_reverse($fixtures);
foreach ($fixtures as $fixture) {
$fixture->unload();
}
foreach ($fixtures as $fixture) {
$fixture->afterUnload();
}
}
请注册或登录以发表评论。