array_merge(): Argument #1 must be of type array, null given phpunitエラーで動けない

array_merge(): Argument #1 must be of type array, null given
テスト書いてこんなエラーが出てきました。
単純なミスが原因なんですけど気づかない時は気づかない…。
翻訳機にかけるとこんな意味
array_merge() 引数 #1 は配列型でなければならず、NULL が指定される
いやいや、そもそもarray_marge使ってないし。
だから配列合成するのにNULL入ってるよと言われても意味不明だし。
はい、それコンストラクタが原因だと思います。
テストコードに【__constract】は使えない
__constractに記載していたものをSetUpに記載するだけでエラー解消です。
真面目にこれだけの話なのですが、ちょっと短すぎるので少々解説を。
__constractを使いたい理由
constract自体については下の記事でご確認ください。
laravelの「__construct()ってなんだ」について
多分もっとも大い理由がFunctionがstaticではないからだと思います。
controllerやserviceでstaticではないfunctionを呼ぶ際にはnewする必要があります。
このnewを行う場所として利用されるのがconstractです。
なので、その流れでTESTにも書いてしまったりしますが、これがエラーの原因となっています。
TestではSetUpが毎回読み込まれる
どのfunctionがどう読み込まれるかを考えると、TestではSetUpが毎回読まれますよね。
SetUpでは主にTestDBに値を格納する工程で利用されます。
で、ServiceやControllerのnewもここで走らせるのですが【お作法】として記載方法が少し変わります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace Tests\Unit\Services; use Tests\TestCase; use App\Services\HogeService; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class HogeServiceTest extends TestCase { use RefreshDatabase; use WithFaker; protected $service; protected function setUp(): void { parent::setUp(); $this->artisan('config:clear'); # このように書く $this->service = app()->make(HogeService::class); } public function test_get_任意の値でData収集() { $this->service->Function名(); } } |
$this->service = new HogeService;ではないんですね。
この記載方法は私も今の現場で初めて知りました。
ちなみに、$this->service = new HogeService;でも問題なく動きます。
まとめ
見たことのないエラーが出てくるとフリーズしますよね。
今回はテストコードのお話ですが、今流行りのアジャイル開発だと1つの機能の実装をテストまで賄います。
そのため、面談の際にテストを書くことができるかという質問を受けることがあります。
自作システムではテストを書くことよりも機能をガンガン積み上げることを優先していたので少々苦手です。
(テストってDBから値消えちゃうので、生データを利用して開発していた私としては手を出せなかったのです)
でも、絶対にやったほうが良いことではあるし、少ないコードで作業すればSeedで時間取らないし、まぁそんな感じです。
-
前の記事
「マイクロサービス設計」と「クリーンアーキテクチャ」の思考の違い 2022.04.01
-
次の記事
ERROR:Target [RepositoryInterface] is not instantiable while building [Errorファイル名] 2022.08.02
コメントを残す