0 关注者

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

受保护的方法

隐藏继承的方法

方法 描述 定义于
createFixtures() 创建指定的 fixture 实例。 yii\test\FixtureTrait

方法详情

隐藏继承的方法

createFixtures() 受保护方法

创建指定的 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;
}

            
fixtures() 公共方法

声明当前测试用例所需的 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 [];
}

            
getFixture() 公共方法

返回命名的 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;
}

            
getFixtures() 公共方法

返回 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;
}

            
globalFixtures() 公共方法

声明不同测试用例共享所需的 fixture。

返回值应类似于 fixtures() 的返回值。您通常应该在基类中覆盖此方法。

另请参阅 fixtures()

public array globalFixtures ( )
返回值 数组

不同测试用例共享和所需的 fixture。

                public function globalFixtures()
{
    return [];
}

            
initFixtures() 公共方法 (自版本 2.0.12 起可用)

初始化 fixture。

public void initFixtures ( )

                public function initFixtures()
{
    $this->unloadFixtures();
    $this->loadFixtures();
}

            
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();
    }
}

            
unloadFixtures() 公共方法

卸载指定的 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();
    }
}