TestCase.php 3.42 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
use yii\test\FixtureTrait;
9 10 11 12 13 14 15

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

20
	/**
Qiang Xue committed
21 22
	 * @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
23
	 * The application configuration array may contain an optional `class` element which specifies the class
Carsten Brandt committed
24
	 * name of the application instance to be created. By default, a [[\yii\web\Application]] instance will be created.
25
	 */
Qiang Xue committed
26
	public $appConfig = '@tests/unit/_config.php';
Qiang Xue committed
27

Mark committed
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
	/**
	 * 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()");
		}
	}

Qiang Xue committed
67 68 69 70 71 72 73
	/**
	 * @inheritdoc
	 */
	protected function setUp()
	{
		parent::setUp();
		$this->mockApplication();
Qiang Xue committed
74
		$this->loadFixtures();
Qiang Xue committed
75
	}
76 77

	/**
Qiang Xue committed
78
	 * @inheritdoc
79 80 81
	 */
	protected function tearDown()
	{
Qiang Xue committed
82
		$this->unloadFixtures();
83 84 85 86
		$this->destroyApplication();
		parent::tearDown();
	}

87
	/**
Qiang Xue committed
88 89 90 91
	 * 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
92
	 * @throws InvalidConfigException if the application configuration is invalid
93
	 */
Qiang Xue committed
94
	protected function mockApplication($config = null)
95
	{
Qiang Xue committed
96
		$config = $config === null ? $this->appConfig : $config;
Qiang Xue committed
97
		if (is_string($config)) {
Qiang Xue committed
98 99 100 101 102
			$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
103
		}
Qiang Xue committed
104 105 106 107 108 109 110
		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
111
		}
112 113
	}

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