目前,我試圖首次將單元測試應用到項目中。兩個問題出現了:單元測試中的依賴關係
它是壞的做法,如果多次測試彼此依賴?在下面的代碼中,幾個測試需要其他測試的結果是肯定的,這是一般的最佳做法嗎?
多遠,你去與嘲諷的對象SUT取決於?在下面的代碼中,'路由器'取決於'Route',這取決於'RouteParameter'。嘲笑,還是不嘲笑?
以下代碼是測試我的「路由器」對象,它接受通過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');
}
}
+1,還有很多更多要說的測試和嘲弄,但這是一個很好的介紹 – Guillaume 2012-01-18 10:19:37
這聽起來合乎邏輯的,感謝這個明確的解釋! – Thanaton 2012-01-18 10:22:15