Red > Green > Refactor > Red

cycle is based on desire

結合テストを構築できるようにすること CakePHP + PHPUnit

はじめに

表題を実現する為のコードベタ貼り

経緯

PHPUnit 使って結合テスト(アクション単体に対する MVC の結合)は構築できるの? -> 公式Docsに出来る旨が書いてある -> やる

app/Controller

  1 <?php
  2   App::uses('AppController', 'Controller');
  3 
  4   class UserController extends AppController {
  5     public function index() {
  6     }
  7   }
  8 ?>

結合テストファイル[Test/Case/Request/UserTest.php]

$ mkdir Test/Case/Request
  1 <?php
  2 
  3 App::uses('HttpSocket', 'Network/Http');
  4 
  5 class UserControllerTest extends ControllerTestCase {
  6   public function setUp() {
  7     parent::setUp();
  8     $this->base_url = 'http://' . $_SERVER['HOSTNAME'];
  9     $this->http_client = new HttpSocket();
 10   }
 11 
 12   public function testIndex() {
 13     $response = $this->http_client->get($this-> base_url . '/user', array(null));
 14     $this->assertEquals(200, $response->code);
 15   } 
 16 } 
 17 ?>
$ ./Console/cake test app Request/User

Welcome to CakePHP v2.5.6 Console
---------------------------------------------------------------
App : app
Path: /opt/lampp/htdocs/cakephp/app/
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
PHPUnit 3.7.32 by Sebastian Bergmann.
.

Time: 34 ms, Memory: 11.75Mb

OK (1 test, 1 assertion)

コントローラーのフローテストなら Test/Case/Controller/UserTest.php に書く

  1 <?php
  2 
  3 class UserControllerTest extends ControllerTestCase {
  4   public function setUp() {
  5     parent::setUp();
  6   } 
  7 
  8   public function testIndex() {
  9     $returns = $this->testAction('/user', array('method' => 'get'));
 10     $this->assertEquals(null, $returns);
 11   } 
 12 } 
 13 ?>

xUnit で結合テストを書いてよいものか

こちらは歴史的経緯など調べておこう