前提・実現したいこと
外部APIへリクエストを投げた際、エラーになった場合の処理のテストを行いたい
発生している問題・エラーメッセージ
テスト用のコントローラーで不正な値を持たせた状態で、API側へ登録リクエストを送りエラーを発生させました
するとAPI側からエラーが返されテストが通りませんでした
Payjp\Error\InvalidRequest: No such token:
if(!$payjpCustomer->save()){ $result = 1; } $this->assertEquals(1, $result);
該当のソースコード(テスト対象のコントローラー)
try { $payjpCustomer = \Payjp\Customer::retrieve($payjpCustomerId); // 登録されているカード情報を削除する $cards = $payjpCustomer->cards->all()["data"]; foreach($cards as $card){ $card = $payjpCustomer->cards->retrieve($card["id"]); $card->delete(); } $payjpCustomerCardData = [ 'card' => $payjpToken ]; $payjpCustomerAddedCard = $payjpCustomer->cards->create($payjpCustomerCardData); $payjpCustomerAddedCardId = $payjpCustomerAddedCard['id']; // Set default card $payjpCustomer->default_card = $payjpCustomerAddedCardId; $payjpCustomer->save(); } catch (InvalidRequest $ex) { $this->log("error 01: " . $ex->getMessage(), "error"); $this->Flash->set("登録に失敗しました。もう一度、やり直してください。"); }
試したこと
テストコードを以下のようにも変更して見ました
当たり前ではあるのですが、これでもその前に書いたエラーがAPI側から返されます
$payjpCustomer->save(); $this->setExpectedException('Cake\Network\Exception\NotFoundException'); $this->post('/payments/pay/'. $Id);
大元のコントローラーではAPI側との通信であれ、その結果をDBに保存するタイミングであれ、何かしら問題が起きればtyr catchでエラーメッセージなどが表示されます
外部サービスと連携してそのような処理を行なっているコントローラーのテストコードを書こうとする場合、テストコードの中でもtyr catchを書いて挙動を見るものなのでしょうか?
もしくは、controllerに対して不正な値がリクエストされた場合に例外が発生する時はユニットテストで検証可能
外部APIなどに対してリクエストを投げてそれによって例外を取得し、振る舞いを変える場合はそのコントローラーで直接デバックしたり、フロント側から操作をすることによってテスト
このような使い分けがなされるのでしょうか?
補足情報(FW/ツールのバージョンなど)
cakephp 3.5
API payjp api
回答1件
あなたの回答
tips
プレビュー