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 array

要建立的 fixture。您可以提供 fixture 名稱或 fixture 配置。如果未提供此參數,則將建立在 globalFixtures()fixtures() 中指定的 fixture。

return yii\test\Fixture[]

已建立的 fixture 實例

throws 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 ( )
return array

目前測試案例所需的 fixture

                public function fixtures()
{
    return [];
}

            
getFixture() public method

傳回指定的 fixture。

public yii\test\Fixture|null getFixture ( $name )
$name string (字串)

測試資料名稱。 這可以是測試資料別名,或者在未使用別名時使用類別名稱。

return yii\test\Fixture|null

測試資料物件;如果指定的測試資料不存在,則為 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() public method

傳回在 globalFixtures()fixtures() 中指定的 fixture 物件。

public yii\test\Fixture[] getFixtures ( )
return yii\test\Fixture[]

目前測試案例已載入的測試資料

                public function getFixtures()
{
    if ($this->_fixtures === null) {
        $this->_fixtures = $this->createFixtures(array_merge($this->globalFixtures(), $this->fixtures()));
    }
    return $this->_fixtures;
}

            
globalFixtures() public method

宣告不同測試案例共用的必要 fixture。

傳回值應與 fixtures() 的傳回值相似。 您通常應該在基底類別中覆寫此方法。

另請參閱 fixtures()

public array globalFixtures ( )
return array

不同測試案例共用和需要的測試資料。

                public function globalFixtures()
{
    return [];
}

            
initFixtures() public method (自版本 2.0.12 起可用)

初始化 fixture。

public void initFixtures ( )

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

            
loadFixtures() public method

載入指定的 fixture。

此方法將為每個測試資料物件呼叫 yii\test\Fixture::load()

public void loadFixtures ( $fixtures null )
$fixtures yii\test\Fixture[]|null

要載入的測試資料。 如果未指定此參數,將使用 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() public method

卸載指定的 fixture。

此方法將為每個測試資料物件呼叫 yii\test\Fixture::unload()

public void unloadFixtures ( $fixtures null )
$fixtures yii\test\Fixture[]|null

要載入的測試資料。 如果未指定此參數,將使用 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();
    }
}