diff --git a/library/think/App.php b/library/think/App.php
index ea01abaa..6f88a9ab 100644
--- a/library/think/App.php
+++ b/library/think/App.php
@@ -212,11 +212,11 @@ class App
// 获取控制器名
$controllerName = strip_tags($result[1] ?: Config::get('default_controller'));
- define('CONTROLLER_NAME', Config::get('url_controller_convert') ? strtolower($controllerName) : $controllerName);
+ defined('CONTROLLER_NAME') or define('CONTROLLER_NAME', Config::get('url_controller_convert') ? strtolower($controllerName) : $controllerName);
// 获取操作名
$actionName = strip_tags($result[2] ?: Config::get('default_action'));
- define('ACTION_NAME', Config::get('url_action_convert') ? strtolower($actionName) : $actionName);
+ defined('ACTION_NAME') or define('ACTION_NAME', Config::get('url_action_convert') ? strtolower($actionName) : $actionName);
// 执行操作
if (!preg_match('/^[A-Za-z](\/|\.|\w)*$/', CONTROLLER_NAME)) {
diff --git a/tests/README.md b/tests/README.md
index 8de71e33..5bba9a74 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -108,7 +108,7 @@ thinkphp5 的测试的主要流程是跟 thinkphp 的系统流程是相似的,
|模块|认领人|进度|
|---|---|---|
|Base|||
-|App|Haotong Lin||
+|App|Haotong Lin|√|
|Build|刘志淳||
|Config|Haotong Lin|√|
|Cache|||
@@ -117,6 +117,7 @@ thinkphp5 的测试的主要流程是跟 thinkphp 的系统流程是相似的,
|Db|||
|Debug|大漠|√|
|Error|大漠||
+|Exception|Haotong Lin|√|
|Hook|流年|√|
|Input|Haotong Lin|√|
|Lang|流年|√|
diff --git a/tests/thinkphp/library/think/appTest.php b/tests/thinkphp/library/think/appTest.php
index 490832a8..a38e9d04 100644
--- a/tests/thinkphp/library/think/appTest.php
+++ b/tests/thinkphp/library/think/appTest.php
@@ -16,12 +16,82 @@
namespace tests\thinkphp\library\think;
+use ReflectionClass;
+use think\App;
+use think\Config;
+
+function func_trim($value)
+{
+ return trim($value);
+}
+
+function func_strpos($haystack, $needle)
+{
+ return strpos($haystack, $needle);
+}
+
+class AppInvokeMethodTestClass
+{
+ public static function staticRun($string)
+ {
+ return $string;
+ }
+
+ public function run($string)
+ {
+ return $string;
+ }
+}
+
class appTest extends \PHPUnit_Framework_TestCase
{
public function testRun()
{
- //\think\App::run();
- //$this->expectOutputString('
');
- // todo...
+ Config::set('root_namespace', ['/path/']);
+
+ App::run();
+
+ $expectOutputString = '';
+ $this->expectOutputString($expectOutputString);
+
+ $rc = new ReflectionClass('\think\Loader');
+ $ns = $rc->getProperty('namespace');
+ $ns->setAccessible(true);
+ $this->assertEquals(true, in_array('/path/', $ns->getValue()));
+
+ $this->assertEquals(true, function_exists('L'));
+ $this->assertEquals(true, function_exists('C'));
+ $this->assertEquals(true, function_exists('I'));
+
+ $this->assertEquals(Config::get('default_timezone'), date_default_timezone_get());
+
+ }
+
+ // function调度
+ public function testInvokeFunction()
+ {
+ $args1 = ['a b c '];
+ $this->assertEquals(
+ trim($args1[0]),
+ App::invokeFunction('tests\thinkphp\library\think\func_trim', $args1)
+ );
+
+ $args2 = ['abcdefg', 'g'];
+ $this->assertEquals(
+ strpos($args2[0], $args2[1]),
+ App::invokeFunction('tests\thinkphp\library\think\func_strpos', $args2)
+ );
+ }
+
+ // 类method调度
+ public function testInvokeMethod()
+ {
+ $_GET = ['thinkphp'];
+ $result = App::invokeMethod(['tests\thinkphp\library\think\AppInvokeMethodTestClass', 'run']);
+ $this->assertEquals('thinkphp', $result);
+
+ $_GET = ['thinkphp'];
+ $result = App::invokeMethod('tests\thinkphp\library\think\AppInvokeMethodTestClass::staticRun');
+ $this->assertEquals('thinkphp', $result);
}
}
diff --git a/tests/thinkphp/library/think/exceptionTest.php b/tests/thinkphp/library/think/exceptionTest.php
new file mode 100644
index 00000000..e6aa13f8
--- /dev/null
+++ b/tests/thinkphp/library/think/exceptionTest.php
@@ -0,0 +1,51 @@
+
+// +----------------------------------------------------------------------
+
+/**
+ * exception类测试
+ * @author Haotong Lin
+ */
+
+namespace tests\thinkphp\library\think;
+
+use ReflectionMethod;
+use think\Exception as ThinkException;
+
+class MyException extends ThinkException
+{
+
+}
+
+class exceptionTest extends \PHPUnit_Framework_TestCase
+{
+ public function testGetHttpStatus()
+ {
+ try {
+ throw new ThinkException("Error Processing Request", 1);
+ } catch (ThinkException $e) {
+ $this->assertEquals(500, $e->getHttpStatus());
+ }
+ }
+
+ public function testDebugData()
+ {
+ $data = ['a' => 'b', 'c' => 'd'];
+ try {
+ $e = new MyException("Error Processing Request", 1);
+ $method = new ReflectionMethod($e, 'setData');
+ $method->setAccessible(true);
+ $method->invokeArgs($e, ['test', $data]);
+ throw $e;
+ } catch (MyException $e) {
+ $this->assertEquals(['test' => $data], $e->getData());
+ }
+ }
+}
diff --git a/tests/thinkphp/library/think/routeTest.php b/tests/thinkphp/library/think/routeTest.php
index 6aaf2ec2..44a9385d 100644
--- a/tests/thinkphp/library/think/routeTest.php
+++ b/tests/thinkphp/library/think/routeTest.php
@@ -94,7 +94,8 @@ class routeTest extends \PHPUnit_Framework_TestCase
{
Route::pattern(['id' => '\d+', 'name' => '\w{6,25}']);
Route::group('group', [':id' => 'index/hello', ':name' => 'index/say']);
- $this->assertEquals(false, Route::check('group/think'));
+ $this->assertEquals(false, Route::check('empty/think'));
+ $this->assertEquals(['type' => 'module', 'module' => [null, 'index', 'say']], Route::check('group/think'));
$this->assertEquals(['type' => 'module', 'module' => [null, 'index', 'hello']], Route::check('group/10'));
$this->assertEquals(['type' => 'module', 'module' => [null, 'index', 'say']], Route::check('group/thinkphp'));
}
diff --git a/tests/thinkphp/library/think/viewTest.php b/tests/thinkphp/library/think/viewTest.php
index 9ebcd906..efb377f3 100644
--- a/tests/thinkphp/library/think/viewTest.php
+++ b/tests/thinkphp/library/think/viewTest.php
@@ -124,7 +124,12 @@ class viewTest extends \PHPUnit_Framework_TestCase
$view_instance = \think\View::instance();
$method = new \ReflectionMethod('\think\View', 'ParseTemplate');
$method->setAccessible(true);
- $this->assertEquals(DS . 'theme_name' . DS . 'template_name.html', $method->invoke($view_instance, 'template_name'));
+ if (defined('CONTROLLER_NAME')) {
+ $expect_data = DS . 'theme_name' . DS . CONTROLLER_NAME . DS . 'template_name.html';
+ } else {
+ $expect_data = DS . 'theme_name' . DS . 'template_name.html';
+ }
+ $this->assertEquals($expect_data, $method->invoke($view_instance, 'template_name'));
}
/**