アプリ版:「スタンプのみでお礼する」機能のリリースについて

今とあるバッチのテストをしようと考えています。
バッチの処理としては、DBから必要なデータを取ってきて(クラスを使っています)、そのデータを元にPEAR::HTTP_Requestクラス使ってGETリクエストを送信するようなものです。

そもそもテストというものに関してド素人なのでよくわかっていないのですが、こういったプログラムをPHPUnitを使ってテストすることは可能なのでしょうか。
出来ればDBからデータ取ってくる部分と、HTTP_Requestクラス使ってGETリクエストを投げる部分をモック化(?)して、これらの戻り値をこっちで制御していくつかのケースでテストしたいです。

テストの先頭で、requireで読み込んだらファイルが実行されてしまうし、execなどを使ってもプログラム内のクラスをモック化する方法が分かりません。

長くなりましたが、聞きたい事としては、こういった逐一実行するようなプログラムのテストはPHPUnitを使ってテスト出来るものなのでしょうか。
また、PHPUnitを使ってテストする場合、テスト対象ファイルの内部で読み込まれたクラスをモック化するにはどうしたらよりのでしょうか。

A 回答 (1件)

DBからデータを拾ってループでリクエストを拾えばさほど難しい話ではないような


気がしますが、httpでの処理をトレースする場合、どこかで引っかかると
その後の処理が流れずにタイムアウトする可能性が高いですね

DBの接続部分と、リクエスト部分のプログラムをわけて
リクエストは非同期で回した方がよいかもしれません

この回答への補足

ご回答ありがとうございます。

具体的には下記のようなバッチ(超単純化して雑ですが)をテストしたいと考えてます。
この既存のプログラムは書き換える事ができず、これが正しく動作していることを確認したいのです。
DBを扱うクラスとかRequestクラスに依存したくないので、これらをモック化したいと考えています。
batch.phpの中でgetIdメソッドとかをモック化してテストするにはどうしたらよいのでしょうか。

【batch.php】
<?php
require_once "HTTP/Request.php";
require "hogeDbClass.php";

$hogeDb = new hogeDbClass();
$id = $hogeDb->getId();

if ($id === false) echo "データ取得失敗";

$web = new HTTP_Request();

if ($id == false) {
$web->setURL('http://test.failure.info');
$result = $web->sendRequest();
if ($web->getResponseCode() !== 200) {
echo "通信失敗";
} else {
echo "通信成功";
}
} else {
$web->setURL('http://test.success.info');
$result = $web->sendRequest();
if ($web->getResponseCode() !== 200) {
echo "通信失敗";
} else {
echo "通信成功";
}
}
?>

【hogeDbClass.php】

<?php
class hogeDbClass
{
private $_db;

public function __construct()
{
$this->_db = new PDO();
}

public function getId()
{
$sql = 'select id from test';
$stmt = $this->_db->prepare($sql);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}

?>

補足日時:2013/01/08 15:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!