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 | 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;
}
宣告目前測試案例所需的 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 [];
}
傳回指定的 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;
}
傳回在 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;
}
public array globalFixtures ( ) | ||
return | array |
不同測試案例共用和需要的測試資料。 |
---|
public function globalFixtures()
{
return [];
}
初始化 fixture。
public void initFixtures ( ) |
public function initFixtures()
{
$this->unloadFixtures();
$this->loadFixtures();
}
載入指定的 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();
}
}
卸載指定的 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();
}
}
Signup (註冊) or Login (登入) in order to comment.