【Laravel】DBエラー時のシナリオのテスト

LaravelRDB

モック以外の方法では意図的に起こすことが難しいタイプの代替コース(雨の日シナリオ)のテスト

PDOをモックする方法を試した

[https://github.com/wand2016/pdo_mock/blob/master/tests/Feature/ArticleTest.php#L48:embed:cite]

  • ConnectionからPDOを引っこ抜き、MockeryでProxy Partial Mockにくるんで再set
  • \PDO@prepare(string $stmt) で死ぬようにする

    • MockInterface@withMockery::pattern等でクエリを狙い撃ちすることも可能そう

懸念

<?php

    /**
     * Set the PDO connection.
     *
     * @param  \PDO|\Closure|null  $pdo
     * @return $this
     */
    public function setPdo($pdo)
    {
        $this->transactions = 0;

        $this->pdo = $pdo;

        return $this;
    }
  • 「アクティブなトランザクションの数」がリセットされるため、RefreshDatabaseトレイトに悪影響を及ぼしそうな気がする

    • 職場のプロジェクト(L5.5)ではテストケース終了時に制御が戻ってこなくなった
    • 自宅のプロジェクト(L6.0)では再現せず。謎

  • 職場でうまくいかないのを自宅で再現して問題解決するはずだったが、テキトーすぎて叶わず

    • Laravelのバージョンくらい揃えようぜ
  • 気軽に動かせるLaravelのSandboxが出来た点は良し

    • GitHubがスッカスカすぎて危機感を覚えていたので
  • ValueObject使ってみたりディレクトリを関心事で切ってみたりするのは楽しかった