🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

PHPUnit

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

Q&A

解決済

1回答

1908閲覧

cakephp3のコントローラーの単体テストでconst.phpの定数を利用するには

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

PHPUnit

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

0グッド

0クリップ

投稿2019/11/27 02:47

前提・実現したいこと

payjpAPIを利用した決済に関係するコントローラーのテストを書いています
テストコントローラーで、通常のコントローラーで利用している定数を使ってAPIとやりとりする場合どのように記述すれば良いでしょうか?

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

Payjp\Error\Authentication: No API key provided. (HINT: set your API key using "Payjp::setApiKey(<API-KEY>)". You can generate API keys from the Payjp web interface. See https://pay.jp/api for details, or email support@pay.jp if you have any questions.

該当のソースコード

<?php namespace App\Test\TestCase\Controller; use App\Controller\PaymentsController; use Cake\TestSuite\IntegrationTestCase; use Cake\ORM\TableRegistry; use Payjp\Error\InvalidRequest; use Cake\Network\Exception\BadRequestException; use Cake\Core\Configure; /** * App\Controller\PaymentsController Test Case */ class PaymentsControllerTest extends IntegrationTestCase { private $_payjpApiSecretKey; private $_payjpApiPublicKey; private $_payjpOAuthClientId; private $_payjpApiTokenKey; public function initialize() { parent::initialize(); $this->_payjpApiSecretKey = Configure::read('Payjp.Api.secretKey'); $this->_payjpApiPublicKey = Configure::read('Payjp.Api.publicKey'); $this->_payjpOAuthClientId = Configure::read('Payjp.OAuth.clientId'); $this->_payjpApiTokenKey = 'payjp_token'; } ・・・略 public function testPay($Id = null){ //API情報取得 \Payjp\Payjp::setApiKey($this->_payjpApiSecretKey); $payjpPlanId = 'XXXXXXXXX'; $payjpPlan = \Payjp\Plan::retrieve($payjpPlanId);

システムで定義している定数や、テスト対象のコントローラーで外から入力された値はテストコントローラーではコード内に任意のものを記述した上でテストをするというのが一般的なのでしょうか?

もしシステムの定数を利用する方法がありましたらご教授いただければと思います

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

cakephp 3.5
テスト環境:ローカル(MAMP)
php 7
DB mysal

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

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

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

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

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

nojimage

2019/11/27 03:13

"システムの定数"とは何を指していますか? defineで定義された定数ですか? それとも Configureの設定値ですか? その利用したい"定数” はどのように定義されたものなのか記述してください。
退会済みユーザー

退会済みユーザー

2019/11/27 03:24

config/const.phpにて定義している定数です
FKM

2019/11/27 03:31

そのAPIキーは使えないってエラー出てるんですが、今使っているキーは取得したものなんでしょうか。 それともテスト用に任意で適当に作ったものでしょうか。
nojimage

2019/11/27 03:37

config/const.php はそのアプリケーション固有のファイルですよね。その中で定数は何を使って定義していますか?
退会済みユーザー

退会済みユーザー

2019/11/27 04:21

payjpの管理画面で確認できるAPIキーを利用しようとしています 定義ファイルの中ではこのような形式でキーなどを定数化しています $config['Api.secretKey'] = 'XXXX'; 通常のコントローラーでは use Cake\Core\Configure;を継承して Configure::read(・・・・);とすれば読み込めていたので同じようにすればテスト用のディレクトリにある、テストコントローラー でも読み込めると思っていました
guest

回答1

0

ベストアンサー

config/const.php が config/boostrap.php で読み込まれていないため、そこに定義されている内容がテストで使えない状態かと思います。

追加の設定ファイルの読み込み | 構成設定 - CakePHP 3.8

Configure::load('const'); がどこかに記述されていると思いますので、 config/boostrap.php で呼び出すように変更するか、個々のテストケースのsetUpメソッドでConfigure::loadを明示的に呼び出すようにすればよいです。

システムで定義している定数や、テスト対象のコントローラーで外から入力された値はテストコントローラーではコード内に任意のものを記述した上でテストをするというのが一般的なのでしょうか?

これについて、テスト時において外部APIのキーなどは、テスト時に間違って本番環境へデータを投げてしまったといったことが発生しないよう、本番用の設定値を使うのではなくテスト用の設定値を使用できるようにすべきと考えます。そのためには、設定値を環境変数で注入できるようにしておくとよいでしょう。

例) const.php で

php

1// ... 2$config['Api'] = [ 3 'secretKey' => env('API_SECRET_KEY', 'デフォルトの値'), 4 // ... 5];

投稿2019/11/27 04:50

編集2019/11/27 04:56
nojimage

総合スコア959

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問