对使用静态框架(类似于FuelPHP)进行单元测试感兴趣,但不确定从哪里开始


Interested in unit testing with a static framework, similar to FuelPHP, but not sure where to start

正如标题所说,我试图理解如何单元测试(或其他类型的测试)一个框架,是建立类似于FuelPHP,你利用静态调用来设置和访问一切。

这导致如下代码:
class Appointment {
  public static function updateStartTime($binds) {
     $query = "UPDATE appointment SET start_time = :start_time 
       WHERE appointment_id = :appointment_id";
     return DB::update($query, $binds);
  }
}

你最终得到的控制器代码看起来像:

$result = Appointment::updateStartTime(array(
  'start_time' => '10:00 am', 
  'appointment_id' => 10
));

所以要测试Appointment::updateStartTime方法,我需要能够为它提供一个假的DB::update方法,但我不确定从哪里开始。

我知道我可以只包含一个模拟类作为测试套件的一部分:

class DB {
  public static function update($params) { return 'success'; }
}

但是这看起来很乏味。是否有更好的方法将测试覆盖率添加到我的框架中,同时仍然使用这种编码风格?

静态方法是可测试性的死亡。PHPUnit为静态类函数提供了一些模拟,但这仅在某些条件下有效(仅在类本身中可行,类必须使用后期静态绑定,参见stub和mock静态方法)。

所以通常我会说:不要测试框架,这应该在框架社区内完成。相反,不要在自己的代码中使用静态类,这样您就可以对自己的代码进行单元测试。