2014-01-23 40 views
16

我有內置的超薄像這樣的API:如何爲構建在Slim Framework中的REST API編寫單元測試?

$app->group('/'.$endpoint, function() use ($app, $endpoint) { 

     $handler = Api\Rest\Handlers\Factory::load($endpoint); 

     if (is_null($handler)) { 
      throw new \Exception('No REST handler found for '.$endpoint); 
     } 

     $app->get('(/:id)', function ($id) use ($app, $handler) { 
      echo json_encode($handler->get($id)); 
     }); 

     $app->post('', function() use ($app, $handler) { 
      echo json_encode($handler->post($app->request->post())); 
     }); 

     $app->put(':id', function ($id) use ($app, $handler) { 
      echo json_encode($handler->put($id, $app->request->put())); 
     }); 

     $app->delete(':id', function ($id) use ($app, $handler) { 
      echo json_encode($handler->delete($id)); 
     }); 

    }); 

$endpoint是一個字符串,例如「用戶」;

我該如何着手編寫單元測試呢?

理想情況下,

class RestUserTest extends PHPUnitFrameworkTestCase 
{ 
    public function testGet() 
    { 
     $slim = ''; // my slim app 
     // set route 'api/user/1' with method GET 
     // invoke slim 
     // ensure that what we expected to happen did 
    } 
} 

(其餘的處理程序類將使它瑣碎嘲笑那些通常由DB備份的結果。)

它是如何欺騙請求轉換成苗條,我穿上」的細節問題不知道該怎麼辦。

回答

10

您可以試試this guidelines。它可能會幫助你。我爲我的一個苗條項目嘗試了它。

讓我知道是否有幫助。

代碼

<?php 

require_once __DIR__ . '/../vendor/autoload.php'; 

use Slim\Environment; 


class RoutesTest extends PHPUnit_Framework_TestCase 
{ 

    public function request($method, $path, $options = array()) 
    { 
     // Capture STDOUT 
     ob_start(); 

     // Prepare a mock environment 
     Environment::mock(array_merge(array(
      'REQUEST_METHOD' => $method, 
      'PATH_INFO' => $path, 
      'SERVER_NAME' => 'slim-test.dev', 
     ), $options)); 

     $app = new \Slim\Slim(); 
     $this->app = $app; 
     $this->request = $app->request(); 
     $this->response = $app->response(); 

     // Return STDOUT 
     return ob_get_clean(); 
    } 

    public function get($path, $options = array()) 
    { 
     $this->request('GET', $path, $options); 
    } 

    public function testIndex() 
     { 
     $this->get('/'); 
     $this->assertEquals('200', $this->response->status()); 
     } 
} 

在吉斯特託管完整的代碼。 see this

+0

你不需要添加路由到'$ app'來使用它來測試不僅僅是一個空的Slim服務器嗎?也許你可以張貼一些代碼來展示你如何使用它來測試一條路線? – rinogo

+0

另外,不應該存儲'Environment :: mock()'的結果,因此它可以用於'\ Slim \ Http \ Request :: createFromEnvironment($ environment)'之類的東西。我一直盯着這段代碼,乍看之下看起來不錯,但我不知道如何使用它......也許這對Slim 2來說有意義,但Slim 3需要一個完全不同的方法? – rinogo

+0

這種方法看起來更加完整和Slim 3-esque:http://stackoverflow.com/a/36111988/114558(有關詳細信息,請參閱答案鏈接中的完整文章) – rinogo

0

您可以使用Codeception API測試/單元測試。看看下面的link