【发布时间】:2012-02-13 01:32:43
【问题描述】:
目前,我第一次尝试将单元测试应用于项目。出现了两个问题:
如果多个测试相互依赖是不好的做法吗?在下面的代码中,几个测试需要其他测试的结果是肯定的,这是一般的最佳做法吗?
SUT 所依赖的模拟对象能走多远? 在下面的代码中,“Router”依赖于“Route”,而“Route”又依赖于“RouteParameter”。模仿还是不模仿?
下面的代码用于测试我的“Router”对象,该对象通过Router::addRoute($route) 接受路由并通过Router::route($url) 路由URL。
class RouterTest extends PHPUnit_Framework_TestCase {
protected function createSimpleRoute() {
$route = new \TNT\Core\Models\Route();
$route->alias = 'alias';
$route->route = 'route';
$route->parameters = array();
return $route;
}
protected function createAlphanumericRoute() {
$route = new \TNT\Core\Models\Route();
$route->alias = 'alias';
$route->route = 'test/[id]-[name]';
$parameterId = new \TNT\Core\Models\RouteParameter();
$parameterId->alias = 'id';
$parameterId->expression = '[0-9]+';
$parameterName = new \TNT\Core\Models\RouteParameter();
$parameterName->alias = 'name';
$parameterName->expression = '[a-zA-Z0-9-]+';
$route->parameters = array($parameterId, $parameterName);
return $route;
}
public function testFilledAfterAdd() {
$router = new \TNT\Core\Helpers\Router();
$router->addRoute($this->createSimpleRoute());
$routes = $router->getAllRoutes();
$this->assertEquals(count($routes), 1);
$this->assertEquals($routes[0], $this->createSimpleRoute());
return $router;
}
/**
* @depends testFilledAfterAdd
*/
public function testOverwriteExistingRoute($router) {
$router->addRoute(clone $this->createSimpleRoute());
$this->assertEquals(count($router->getAllRoutes()), 1);
}
/**
* @depends testFilledAfterAdd
*/
public function testSimpleRouting($router) {
$this->assertEquals($router->route('route'), $this->createSimpleRoute());
}
/**
* @depends testFilledAfterAdd
*/
public function testAlphanumericRouting($router) {
$router->addRoute($this->createAlphanumericRoute());
$found = $router->route('test/123-Blaat-and-Blaat');
$data = array('id' => 123, 'name' => 'Blaat-and-Blaat');
$this->assertEquals($found->data, $data);
}
/**
* @expectedException TNT\Core\Exceptions\RouteNotFoundException
*/
public function testNonExistingRoute() {
$router = new \TNT\Core\Helpers\Router();
$router->route('not_a_route');
}
}
【问题讨论】:
标签: php unit-testing testing dependencies phpunit