Symfonyに挑戦14「Jobeet 8日目」

8日目: 単体テスト

単体テストを実行

  1. jobeet/test/unit/JobeetTest.phpを作成してコードをコピペ
  2. ターミナルでJobeetTest.phpを実行
Mac:~ kaneda$ php test/unit/JobeetTest.php
もしくは、
Mac:~ kaneda$ php symfony test:unit Jobeet

「Looks like everything went fine. 」と表示された。

slugifyをテストする

5日目に作ったslugify()メソッドをテストする。

  1. jobeet/test/unit/JobeetTest.phpを変更

【覚書】

<?php
// テスト用のファイルを読み込み
require_once dirname(__FILE__).'/../bootstrap/unit.php';
// limeテストツールを準備
$t = new lime_test(6, new lime_output_color());
// jobeetクラス(jobeet/lib/Jobeet.class.php)のslugifyメソッドにテスト用の引数を渡す。
// is($v1, $v2)で、$v1とv2の値が等しかったらテスト結果がOKになる
$t->is(Jobeet::slugify('Sensio'), 'sensio');
// 三つ目の引数にテストの説明文を書けばわかりやすい
$t->is(Jobeet::slugify('Sensio'), 'sensio', 'テストの説明');

新しい機能のためにテストを追加する

  1. jobeet/test/unit/JobeetTest.phpにテストを一個追加して、4行目のlime_testの第一引数を7に変更
  2. jobeet/lib/Jobeet.class.phpのslugify()メソッドを変更

【覚書】

  • テストを先に書いてから機能を実装していく手法がある。テスト駆動開発(TDD)というらしい

バグが原因でテストを追加する

  1. jobeet/test/unit/JobeetTest.phpにテストを一個追加して、4行目のlime_testの第一引数を8に変更
  2. jobeet/lib/Jobeet.class.phpのslugify()メソッドを変更

【覚書】

  • バグを見つけたらまずテスト!
  • Symfonyを作った人はフランス人

Propel単体テスト

Propelモデルのテストにはデータベースの接続が必要なので、テスト用のデータベースを別途作成する。
※jobeet_testデータベースはphpMyAdminで作成した。

Mac:~ kaneda$ php symfony configure:database --env=test "mysql:host=localhost;dbname=jobeet_test" DBアカウント DBパスワード
Mac:~ kaneda$ php symfony propel:insert-sql --env=test
  1. jobeet/data/fixturesディレクトリをjobeet/testに丸々コピー(jobeet/test/fixturesフォルダが出来る)
  2. jobeet/bootstrap/Propel.phpファイルを作りコードをコピペ
  3. jobeet/test/unit/model/JobeetJobTest.phpファイルを作りコードをコピペ

※JobeetJobTest.phpファイルの中身↓

<?php

include(dirname(__FILE__).'/../../bootstrap/Propel.php');
 
$t = new lime_test(3, new lime_output_color());

$t->comment('->getCompanySlug()');
$job = JobeetJobPeer::doSelectOne(new Criteria());
$t->is($job->getCompanySlug(), Jobeet::slugify($job->getCompany()), '->getCompanySlug() return the slug for the company');

$t->comment('->save()');
$job = create_job();
$job->save();
$expiresAt = date('Y-m-d', time() + 86400 * sfConfig::get('app_active_days'));
$t->is($job->getExpiresAt('Y-m-d'), $expiresAt, '->save() updates expires_at if not set');
 
$job = create_job(array('expires_at' => '2008-08-08'));
$job->save();
$t->is($job->getExpiresAt('Y-m-d'), '2008-08-08', '->save() does not update expires_at if set');
 
function create_job($defaults = array())
{
  static $category = null;
 
  if (is_null($category))
  {
    $category = JobeetCategoryPeer::doSelectOne(new Criteria());
  }
 
  $job = new JobeetJob();
  $job->fromArray(array_merge(array(
    'category_id'  => $category->getId(),
    'company'      => 'Sensio Labs',
    'position'     => 'Senior Tester',
    'location'     => 'Paris, France',
    'description'  => 'Testing is fun',
    'how_to_apply' => 'Send e-Mail',
    'email'        => 'job@example.com',
    'token'        => rand(1111, 9999),
    'is_activated' => true,
  ), $defaults), BasePeer::TYPE_FIELDNAME);
 
  return $job;
}

そしてテストを実行

Mac:~ kaneda$ php symfony test:unit JobeetJob
全てのテストをまとめて実行↓
Mac:~ kaneda$ php symfony test:unit