PHP

FakerPHP/Faker で \Faker\Generator::image が使えない #php #laravel

概要 Laravel の Factory で画像のテストデータを作ろうとして $this->faker->image(storage_path('app/public/images')) とかやっても、画像ファイルがうまく生成されず、画像ファイル名も 0 とかで生成されてしまう。 v1.20.0 で非推奨になっており、 Fake…

phpunit-snapshot-assertions にコントリビュートした #php

PHP

スナップショットテストをやりたいなと思って spatie/phpunit-snapshot-assertions を導入してみた。 github.com ところが PHPUnit でデータプロバイダをつかったパラメータライズドテストをやっていると、どうもうまくいかない。 原因は、データセット名に…

Laravel の補完を PHPStorm で使いやすくする #Laravel #PHPStorm

概要 Laravel のモデルでクエリを組み立てようとすると、 Method 'where' not found と言われてしまう。 このせいで PHPStorm の補完が効かなかったり、警告が出てしまったりする。 first(); // query() をかませると平気なんだけれども、面倒 MyModel::quer…

TravisCI で PHP7 のビルドがエラーになる #TravisCI #php

(2022/03/17 追記) フォーラムで話題になっており、サポートからも連携されたようなので、そのうち直りそう。 travis-ci.community 問題 php7.4 で TravisCI が突然コケるようになってしまった。 php: error while loading shared libraries: libargon2.so.1…

AWS SDK for PHP を Mock する #php

AWS SDK を使って Amazon SNS 使用箇所のテストを書こうとしていたところ、 PHPUnit の Mock を無邪気に使ったら怒られてしまった。 phpunit Trying to configure method "publish" which cannot be configured because it does not exist, has not been spe…

PHP7 で CakePHP4 の FrozenDate を使うと、月差分が正しく判定されない場合がある #php #cakephp

概要 PHP8.1 未満の環境における CakePHP の FrozenDate は、 UTC でない Timezone を使った場合に、日付差分が正しく取れないケースがある。 FrozenTime を使うようにするか、 PHP8.1 以降にバージョンを上げると解決する。 ※タイトルでは PHP7 としている…

PHP でメモリが足りなくなったら #php

PHP

メモリが足りなくて死んじゃう ↓みたいなメッセージが出て死んじゃうことがある。 PHP Fatal error: Out of memory (allocated 39845888) (tried to allocate 512000 bytes)... Fatal error : Allowed memory size of 2147483648 bytes exhausted (tried to …

CakePHP3 から CakePHP4 に移行したら Middleware が動かなくなった #cakephp

現象 CakePHP3 から CakePHP4 に移行した際に、CakePHP がデフォルトで提供しているミドルウェアを拡張して利用していた Middleware が動かなくなった。(正確には意図しない挙動になった) 原因 CakePHP3 ではミドルウェアは __invoke($request, $response,…

CakePHP で uploadedFile の Validation をテストする #cakephp #php

概要 CakePHP にはアップロードファイル用の validator が用意されていて便利。 ただテストをするときにちょっとめんどくさい点が2つある。 1つ目はファイルをアップロードするリクエストを作ること。 リクエストするデータとは別に $_FILES にも情報を突…

CakePHP4 と php8 の Docker コンテナを作った #cakephp #php

概要 公式 Docker Image の php:8.0-apache をベースにして、CakePHP のコンテナを作った。 DockerHub & GitHub に置いてある。 hub.docker.com github.com なんで作ったか ここ最近は仕事で触る中心が CakePHP になっているので、手元で色々試せる環境をサ…

認証付きリクエストをテストする #cakephp

環境 CakePHP 4.2.1 cakephp/authentication 2.5.0 認証はセッション方式 概要 認証付きエンドポイントを何もせずにテストすると、(未ログインで)302転送されてしまう。 セッションに偽の認証情報を入れることで、認証を通り抜けてテストできる。 やり方 …

PHPUnit のモックで、引数に応じて戻り値を変更する #php #PHPUnit

概要 returnValueMap を使うと引数に応じて戻り値を変更できる 例外を返したいときは returnCallback() を使うと便利 returnValueMap を使う returnValue に [引数, 戻り値] の配列を渡すと、引数に応じた戻り値を返す Mock を作れる。 引数が複数ある場合は…

CakePHP3 を CircleCI でテストする #cakephp

概要 CakePHP3 を CircleCI でテストするようにするまとめ。 Database を使ったテストも出来るようにしています。 TL;DR 最終的な yml はこんな感じです。 version: 2 jobs: build: docker: - image: circleci/php:7.1.32-fpm-node-browsers environment: DA…

CakePHP3 でテストの置き場所を変更する #cakephp

概要 CakePHP3 では tests/ 配下にテストコードを書くことになっている。 何らかの原因(察して)でパスを規定から変更したい場合の修正箇所に付いてまとめる。 以降 tests/PHPUnit/ に変更すると仮定して記載する。 paths.php TESTS が定義されているので書…