phpユニットテストステップ(13)-コアテクノロジー-mockオブジェクト-mockとstubを同時に使用
4962 ワード
phpユニットテストステップ(13)-コアテクノロジー-mockオブジェクト-mockとstubを同時に使用
このシリーズの文章の主なコードと文字は「ユニットテストの芸術」に由来し、原作者:Roy Osherove.金迎.
このシリーズの文章はphpの文法と使用習慣に基づいて改編された.すべてのコードは本機でテストに合格した.転載する場合は出典を明記してください.需要変更を仮定すると、より複雑になります.ファイル名が短すぎると、ウェブサービスはログを記録しますが、万が一記録中に異常が発生した場合は、メールを送信する必要があります.テストを要求してメールを送信するのは成功した.
ソースコードには2つのインタフェースがあり,1つの被測定クラスがある.テストコードには2つの擬似オブジェクトクラス、1つのテストクラスがあります.
ソースコード
(1)t 2アプリケーションindexcontrollerで、エラーログインタフェースIWebServices.php
(2)t 2アプリケーションindexcontrollerで、メールインタフェースIEmailServices.php
(3)被測定類は,万一異常を投げたらメールを送るという機能を実現する.t 2アプリケーションindexcontrollerでLogAnalyzer.php
テストコード
(4)t 2testsindexcontrollerで、エラーログインタフェースの杭類FakeWebServicesを実現する.php
(5)t 2testsindexcontrollerの下で、メールインタフェースのmockクラスを実現し、断言するFakeEmailServices.php
(6)テストクラスは,主に投げ異常を断言した場合,メール送信に成功した.t 2testsindexcontroller下、LogAnalyzerTest.php
cmdでテストに合格した.
まとめ
原作者は次のように考えている.の1つのテストでは、最大1つのmockオブジェクトしかないはずです.他のすべての偽オブジェクトは杭であるべきです.複数のmockオブジェクトがある場合は、複数のテストに分けて、各テストに1つのmockオブジェクトしかないことを確認します. 1のテストでは、作業ユニットの3つの最終結果のうちの1つしか断言できません.3つの結果は,断言戻り値,断言オブジェクトまたはシステム状態,断言オブジェクトインタラクションである.目的は明確にしなければならない.複数の異なるテスト意図がある場合は、複数のテストに分ける必要があります.
このシリーズの文章の主なコードと文字は「ユニットテストの芸術」に由来し、原作者:Roy Osherove.金迎.
このシリーズの文章はphpの文法と使用習慣に基づいて改編された.すべてのコードは本機でテストに合格した.転載する場合は出典を明記してください.需要変更を仮定すると、より複雑になります.ファイル名が短すぎると、ウェブサービスはログを記録しますが、万が一記録中に異常が発生した場合は、メールを送信する必要があります.テストを要求してメールを送信するのは成功した.
ソースコードには2つのインタフェースがあり,1つの被測定クラスがある.テストコードには2つの擬似オブジェクトクラス、1つのテストクラスがあります.
ソースコード
(1)t 2アプリケーションindexcontrollerで、エラーログインタフェースIWebServices.php
(2)t 2アプリケーションindexcontrollerで、メールインタフェースIEmailServices.php
(3)被測定類は,万一異常を投げたらメールを送るという機能を実現する.t 2アプリケーションindexcontrollerでLogAnalyzer.php
service = $service;
$this->email = $email;
}
/**
* , , , , 。
* @param string $filename
*/
public function analyze($filename)
{
if (strlen($filename) < 8 ) {
try {
$this->service->logError("Filename too short:{$filename}");
} catch ( \Exception $e ) {
$this->email->sendEMail("[email protected]", "can not log", $e->getMessage());
}
}
// 。
// ... ...
}
}
テストコード
(4)t 2testsindexcontrollerで、エラーログインタフェースの杭類FakeWebServicesを実現する.php
toThrow) {
throw $this->toThrow;
}
}
}
(5)t 2testsindexcontrollerの下で、メールインタフェースのmockクラスを実現し、断言するFakeEmailServices.php
to = $to;
$this->subject = $subject;
$this->body = $body;
}
}
(6)テストクラスは,主に投げ異常を断言した場合,メール送信に成功した.t 2testsindexcontroller下、LogAnalyzerTest.php
toThrow = new \Exception("fake exception");
// mock ,
$mockEmail = new FakeEmailService();
// , mock
$analyzer = new \app\index\controller\LogAnalyzer($stubService, $mockEmail);
$tooShortFileName= 'abc.ext';
//
$analyzer->analyze($tooShortFileName);
// mock !!
$this->assertEquals($mockEmail->to, "[email protected]");
$this->assertEquals($mockEmail->subject, "can not log");
$this->assertEquals($mockEmail->body, "fake exception");
}
}
cmdでテストに合格した.
まとめ
原作者は次のように考えている.