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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

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

Q&A

2回答

1183閲覧

PHPUnit クラス継承をしたメソッドのテストをしたい

songman

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

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

0グッド

0クリップ

投稿2022/12/22 18:09

前提

別クラスを継承したクラスのメソッドのテストできない。

現在php unitでテストを行っています。

Bクラス継承したAクラス

1use B; 2 3class A extends B { 4 省略... 5 private function getTotal( 6 //Bクラスのメソッド使用↓ 7 this->line("計算開始");   8 ); 9 ... 省略 10}

Aクラスのtest

1use A; 2use Tests\TestCase; 3 4class aTest extends TestCase{ 5     省略... 6   public function AクラスのgetTotalが通るかのテスト() : void{ 7 //ReflectionClassをテスト対象のクラスをもとに作る. 8   $reflection = new \ReflectionClass(A); 9 // メソッドを取得する. 10 $method = $reflection->getMethod('getTotal'); 11 // アクセス許可をする. 12 $method->setAccessible(true); 13 14 $from = 20. 15 $to = 30. 16 17 $this->assertEquals($method->invokeArgs(A, [$from, $to]), '50.0000'); 18    } 19   ... 省略 20} 21

処理は簡略化しております。

実現したいこと

Bを親クラスとして継承したAクラスのgetTotalというメソッドをテストしたい。

発生している問題・エラーメッセージ

AクラスのgetTotalというメソッドを実行する際に、Bクラスのthis->line()のメソッドを呼び出している。
しかし実行に失敗をし下記のエラーが発生してしまう。

エラー文

Error: Call to a member function writeln() on null
PHP,Laravel

試したこと

・Bクラスのインスタンスが作れていないため、テスト用にインスタンスをつくれれば良いのではと思った。
→ReflectionClassをテスト対象のクラスをもとに作る際に、クラスBを継承できるような書き方があるのか探していた。具体的な書き方を調べていたがわからなかった。そもそもReflectionClassではできないのではという答えに辿り着いた。

・スタブクラスでAクラスBクラスを含めたテスト用のクラスを作成しようとしたが、具体的にどのような処理にすれば良いかわからなかった。

解決策等ありましたら、どんな小さなことでもご教授いただけたら幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PHP 7.4.25

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

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

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

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

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

guest

回答2

0

なんで「artisanコマンドのテストをしたい」という本当にやりたいことを書かないのか。
Error: Call to a member function writeln() on nullのエラーだけでartisanコマンドのことだと分かる人はほとんどいない。

artisanコマンドのテストはこう書く

php

1public function test_console_command() 2{ 3 $this->artisan('inspire')->assertExitCode(0); 4}

https://laravel.com/docs/9.x/console-tests

privateメソッドはReflectionを使った強引な方法を使ってまでテストすることはない。
他の部分のテストでprivateメソッドも通るからprivateメソッドだけテストする必要はない。

投稿2022/12/22 23:15

kawax

総合スコア10377

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

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

yuma.inaura

2022/12/22 23:32

> privateメソッドはReflectionを使った強引な方法を使ってまでテストすることはない。 ですね
guest

0

試したところ普通にできました。何か別原因じゃないでしょうか。
ReflectionClassの引数にオブジェクトじゃなくてクラスを渡しているのは関係ないですか?

php

1<?php 2namespace App; 3 4class Bar 5{ 6 protected function bar() { 7 return 1; 8 } 9} 10 11class Foo extends Bar { 12 13 private function foo() { 14 return $this->bar(); 15 } 16} 17?>

php

1<?php 2 3use PHPUnit\Framework\TestCase; 4use App\Foo; 5 6class fooTest extends TestCase 7{ 8 9 protected $obj; 10 protected function setUp(): void 11 { 12 $this->object = new Foo(); 13 } 14 public function testFoo() 15 { 16 $reflection = new \ReflectionClass($this->object); 17 $method = $reflection->getMethod('foo'); 18 $method->setAccessible(true); 19 20 $this->assertEquals($method->invoke($this->object, ''), 1); 21 } 22} 23?>
$ phpunit ./test PHPUnit 9.5.27 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 00:00.004, Memory: 4.00 MB OK (1 test, 1 assertion)

投稿2022/12/22 23:31

yuma.inaura

総合スコア1453

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問