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

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もここで走らせるのですが【お作法】として記載方法が少し変わります。

$this->service = app()->make(HogeService::class);

$this->service = new HogeService;ではないんですね。
この記載方法は私も今の現場で初めて知りました。
ちなみに、$this->service = new HogeService;でも問題なく動きます。

まとめ

見たことのないエラーが出てくるとフリーズしますよね。
今回はテストコードのお話ですが、今流行りのアジャイル開発だと1つの機能の実装をテストまで賄います。
そのため、面談の際にテストを書くことができるかという質問を受けることがあります。
自作システムではテストを書くことよりも機能をガンガン積み上げることを優先していたので少々苦手です。
(テストってDBから値消えちゃうので、生データを利用して開発していた私としては手を出せなかったのです)
でも、絶対にやったほうが良いことではあるし、少ないコードで作業すればSeedで時間取らないし、まぁそんな感じです。