TestCase.php 3.52 KB
Newer Older
1 2 3 4 5
<?php

namespace yii\codeception;

use Yii;
Qiang Xue committed
6
use yii\base\InvalidConfigException;
7
use Codeception\TestCase\Test;
Qiang Xue committed
8 9 10 11
use yii\base\UnknownMethodException;
use yii\base\UnknownPropertyException;
use yii\test\ActiveFixture;
use yii\test\FixtureTrait;
12 13 14 15 16 17 18

/**
 * TestCase is the base class for all codeception unit tests
 *
 * @author Mark Jebri <mark.github@yandex.ru>
 * @since 2.0
 */
19
class TestCase extends Test
20
{
Qiang Xue committed
21 22
	use FixtureTrait;

23
	/**
Qiang Xue committed
24 25
	 * @var array|string the application configuration that will be used for creating an application instance for each test.
	 * You can use a string to represent the file path or path alias of a configuration file.
Qiang Xue committed
26 27
	 * The application configuration array may contain an optional `class` element which specifies the class
	 * name of the application instance to be created. By default, a [[yii\web\Application]] instance will be created.
28
	 */
Qiang Xue committed
29
	public $appConfig = '@tests/unit/_config.php';
Qiang Xue committed
30

Qiang Xue committed
31 32 33 34 35 36 37
	/**
	 * @inheritdoc
	 */
	protected function setUp()
	{
		parent::setUp();
		$this->mockApplication();
Qiang Xue committed
38
		$this->loadFixtures();
Qiang Xue committed
39
	}
40 41

	/**
Qiang Xue committed
42
	 * @inheritdoc
43 44 45
	 */
	protected function tearDown()
	{
Qiang Xue committed
46
		$this->unloadFixtures();
47 48 49 50
		$this->destroyApplication();
		parent::tearDown();
	}

Qiang Xue committed
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	/**
	 * Returns the value of an object property.
	 *
	 * Do not call this method directly as it is a PHP magic method that
	 * will be implicitly called when executing `$value = $object->property;`.
	 * @param string $name the property name
	 * @return mixed the property value
	 * @throws UnknownPropertyException if the property is not defined
	 */
	public function __get($name)
	{
		$fixture = $this->getFixture($name);
		if ($fixture !== null) {
			return $fixture;
		} else {
			throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
		}
	}

	/**
	 * Calls the named method which is not a class method.
	 *
	 * Do not call this method directly as it is a PHP magic method that
	 * will be implicitly called when an unknown method is being invoked.
	 * @param string $name the method name
	 * @param array $params method parameters
	 * @throws UnknownMethodException when calling unknown method
	 * @return mixed the method return value
	 */
	public function __call($name, $params)
	{
		$fixture = $this->getFixture($name);
		if ($fixture instanceof ActiveFixture) {
			return $fixture->getModel(reset($params));
		} else {
			throw new UnknownMethodException('Unknown method: ' . get_class($this) . "::$name()");
		}
	}

90
	/**
Qiang Xue committed
91 92 93 94
	 * Mocks up the application instance.
	 * @param array $config the configuration that should be used to generate the application instance.
	 * If null, [[appConfig]] will be used.
	 * @return \yii\web\Application|\yii\console\Application the application instance
Qiang Xue committed
95
	 * @throws InvalidConfigException if the application configuration is invalid
96
	 */
Qiang Xue committed
97
	protected function mockApplication($config = null)
98
	{
Qiang Xue committed
99
		$config = $config === null ? $this->appConfig : $config;
Qiang Xue committed
100
		if (is_string($config)) {
Qiang Xue committed
101 102 103 104 105
			$configFile = Yii::getAlias($config);
			if (!is_file($configFile)) {
				throw new InvalidConfigException("The application configuration file does not exist: $config");
			}
			$config = require($configFile);
Qiang Xue committed
106
		}
Qiang Xue committed
107 108 109 110 111 112 113
		if (is_array($config)) {
			if (!isset($config['class'])) {
				$config['class'] = 'yii\web\Application';
			}
			return Yii::createObject($config);
		} else {
			throw new InvalidConfigException('Please provide a configuration array to mock up an application.');
Qiang Xue committed
114
		}
115 116
	}

117
	/**
Qiang Xue committed
118
	 * Destroys the application instance created by [[mockApplication]].
119
	 */
120 121
	protected function destroyApplication()
	{
Qiang Xue committed
122
		Yii::$app = null;
123 124
	}
}