素のPDOとPDOStatementでもスタブ・モックでテストしたい
本格的なDBのテストはdbunit
を使うんだけど、DBを含めたテストじゃなくて何らかのデータがあれば良くて、でもORM的なものは使ってないからデータ取得メソッドのスタブを作りづらい場合。ちょっとしたPDO
の処理もcreateMock
で簡単にテスト出来ないもんだろうか。
<?php
namespace Sample;
use PDO;
use PDOStatement;
class Sample
{
private function parseRows(PDOStatement $stmt){
$ret = [];
foreach ($stmt as $row) {
$ret[] = $row['name']
. "\t" . $row['color']
. "\t" . $row['calories']
. "\n";
}
return $ret;
}
public function getFruit(PDO $conn) {
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
$stmt = $conn->query($sql);
return $this->parseRows($stmt);
}
}
マニュアルのコードから持ってきた。
PDO
を直接使ってる簡単なコードと思いきや、型がしっかり書いてあったりして。
ちょっとしたキーバリューデータがメインのロジックに少し入っているだけといった場合に。
<?php
declare(strict_types=1);
namespace Sample;
use PHPUnit\Framework\TestCase;
use PDO;
use PDOStatement;
use IteratorAggregate;
use ArrayIterator;
final class SmapleTest extends TestCase
{
public function testGetFruit()
{
$stub = $this->getMockBuilder(PDO::class)
->disableOriginalConstructor()
->disableArgumentCloning()
->disallowMockingUnknownTypes()
->getMock();
$stub->method('query')
->willReturn(new class extends PDOStatement implements IteratorAggregate {
function getIterator(){
return new ArrayIterator([
[
'name' => 'apple',
'color' => 'red',
'calories' => 150,
],
[
'name' => 'banana',
'color' => 'yellow',
'calories' => 250,
],
]);
}
});
$target = new Sample();
$ret = $target->getFruit($stub);
$this->assertEquals("apple\tred\t150\n", $ret[0]);
$this->assertEquals("banana\tyellow\t250\n", $ret[1]);
}
}
そいうときはPDO
の返却値でPDOStatement
を継承したクラスを返せばいける。
PDOStatement
はTraversable
を直接実装しているというPHPのコードでは有り得ない状態になっているんだけど、IteratorAggregate
を実装すれば問題なくイテレーターを置き換えられるみたい。
検索したらPDOStatement
を継承したテスト専用モッククラスを作るとか見かけたけども、今ならnew class
でいいよね。
Author And Source
この問題について(素のPDOとPDOStatementでもスタブ・モックでテストしたい), 我々は、より多くの情報をここで見つけました https://qiita.com/nishimura/items/0bbbd79cdf0841b2f848著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .