PHPunitでコードをテストしています。私のコードには、名前、年齢、カウント、およびランダムによる順序付け方法がいくつかあります。カウントによるソートの実装とテストの下。これらはかなり些細なことです。
class Cloud {
//...
public function sort($by_property) {
usort($this->tags, array($this, "cb_sort_by_{$by_property}"));
return $this;
}
private function cb_sort_by_name($a, $b) {
$al = strtolower($a->get_name());
$bl = strtolower($b->get_name());
if ($al == $bl) {
return 0;
}
return ($al > $bl) ? +1 : -1;
}
/**
* Sort Callback. High to low
*/
private function cb_sort_by_count($a, $b) {
$ac = $a->get_count();
$bc = $b->get_count();
if ($ac == $bc) {
return 0;
}
return ($ac < $bc) ? +1 : -1;
}
}
テスト済み:
/**
* Sort by count. Highest count first.
*/
public function testSortByCount() {
//Jane->count: 200, Blackbeard->count: 100
//jane and blackbeard are mocked "Tags".
$this->tags = array($this->jane, $this->blackbeard);
$expected_order = array("jane", "blackbeard");
$given_order = array();
$this->object->sort("count");
foreach($this->object->get_tags() as $tag) {
$given_order[] = $tag->get_name();
}
$this->assertSame($given_order, $expected_order);
}
でも今、「ランダムな順序付け」を追加したい
/**
* Sort random.
*/
public function testSortRandom() {
//what to test? That "shuffle" got called? That the resulting array
// has "any" ordering?
}
実装は、0、-1、または +1 をランダムに返すコールバックの呼び出しshuffle($this->tags)
から何でもかまいません。usort
パフォーマンスは問題ですが、テスト容易性はより重要です。
配列がランダムに並べられたことをテストする方法は? 私の知る限り、のようなグローバルメソッドをスタブ化するのは非常に困難shuffle
です。