質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1026閲覧

レガシーなコードに対してのphpunit の書き方

0matsuki

総合スコア3

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2021/10/29 06:03

編集2021/10/29 06:04

下記のようなコードに対してユニットテストを書こうとしています。
①どのようにしたらテストコードが書けますか?
②かけない場合、どのようにコードを変更すればよいですか?

対象のソースコード)

<? class Sample_Model_Service_A { private $_result private $_options private $_someValue public function __construct($params, $ids, $data) { $this->_options = Sample_Model_Service_B::getOption($data); } private function setSomeValue() { // $someValueを$_optionsをもとに整形を行う処理 $this->_someValue= $someValue; } private function setResult() { // $someValueをさらに別の観点で整形を行う処理 // この処理を一部変更したためテストを書きたい $this->_result = $result; } public function getter() { // 取り出し retrn $this->_result; } } ?> <? class Sample_Model_Service_B { // DBからOptionを取り出す public static function getOption($data) { $dao = new Model_Dao_Option(); $option = $dao->getOption($data['id']); return $option; } } ?>

現状書いているテストコード)

public function testsetResult() { // とりあえず途中まで動くように定義 $params = $ids = $data = []; // ReflectionClassが使えると読んで使ってみたが、Sample_Model_Service_Aを生成しきれない(DB周りのテストの仕方が分かっていない) $sample = new Sample_Model_Service_A($params, $ids, $data); $reflection = new ReflectionClass($sample); $method = $reflection->getMethod('setresult'); $method->setAccessible(true); $result = $method->invoke($sample); // アサート $this->assertSame($result); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

Mockeryを用いて依存関係のオブジェクトをmockに置き換える事でコードを変えずにテストを書くことができました。
下記参考記事になります。
https://qiita.com/itatemi/items/9e5e37b3b50791f00a73

投稿2021/10/30 09:26

0matsuki

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

// ReflectionClassが使えると読んで使ってみたが、Sample_Model_Service_Aを生成しきれない(DB周りのテストの仕方が分かっていない)

「DB周りのテストの仕方が分かっていない」ので困っているという理解で合ってますか?

PHPは詳しくありませんが、DBに限らず外部への依存があると、ユニットテストは書きにくいです。

一案ですが、ユニットテスト用のoptionsをコンストラクタで渡した場合にDBを参照しないようにすれば、DBへの依存を切り離せます。

PHPをあまり書いたことがないので、構文に間違いがあるかもしれませんが、次のようなイメージです。

lang

1public function __construct($params, $ids, $data, $options == null) { 2 $this->_options = $options == null ? Sample_Model_Service_B::getOption($data) : $options; 3}

testsetResultの中で$optionsをセットします。

public function testsetResult() { ... $sample = new Sample_Model_Service_A($params, $ids, $data, $options); ... }

投稿2021/10/30 08:48

編集2021/10/30 08:58
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0matsuki

2021/10/30 09:25

コメントありがとうございます! 下記記事にあるような、コンストラクター・インジェクションの考え方でのテストですね! https://qiita.com/1000k/items/aef6aed46b0fc34cc15e 今回自分がテストを書こうとしているコードに対してご提示していただいた方法でDB接続を回避する場合、7個ほど引数の追加をしなければならなかったため、断念しました。 折角コメントを付けていただいて申し訳ないのですが、今回はMockeryを使う方法で自己解決しましたので、自己解決の方に解決方法を記載させていただきます。 コメントいただきありがとうございました!
jhashimoto

2021/10/30 09:29

解決したようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問