質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

2回答

639閲覧

外部APIの返却値に応じた処理の単体テストの実施方法

akirakond

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

1クリップ

投稿2022/06/17 08:22

編集2022/06/17 08:29

現在外部APIが処理途中で入るようなAPIの作成を行っています。
外部APIを処理途中に挟んでいるのですが、その処理結果を用いての単体テストをどう行えばよいのか悩んでいます。

C#

1public 作成したAPI(){ 2  API内の処理 3  ・・・ 4  var response = 外部APIを実行するメソッド(); 5   6  try{ 7    // メソッドのステータスコードを参照し、200以外エラーとする。 8    if(response.ステータス == 1){ 9      Exception 10    }else if(response.ステータス == 2){ 11      Exception 12    } 13    続きの処理 14    ・・・ 15  }catch(Exception e){ 16   エラー処理 17  } 18}

「作成したAPI()」の単体テスト実施時に、上記の「外部APIを実行するメソッド()」で返却されるステータスを任意で指定したいのですが
上記のような場合の単体テストの実施方法について、アドバイスや方法が記載されているWEBサイトをご教示いただきたいです。

以下、環境です。
OS:Windows 10
FW:.Net Framework 4.5.2
IDE:Visual Studio 2017

お忙しい中ご参照いただきありがとうございます。
よろしくお願いいたします。

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

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

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

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

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

Zuishin

2022/06/17 08:33

リリース時には外部 API を、テスト時にはモックを呼び出すコードを書き、現在の外部 API を呼び出している部分をそれに差し替えてテストする方法がポピュラーです。
akirakond

2022/06/17 08:53

Zuishinさん ご教示ありがとうございます。 具体的なイメージですが、下記のようでよろしかったでしょうか。 「外部APIを実行するメソッド()」の外部APIを実行する箇所で 1. 本番用とテスト用で分岐を作る 2. テスト用として実行時には接続先をモックとし、モックの返却値は実行時のパラメーター等で判断させる。 このような場合テストコードが混ざった状態で本番リリースとなるのがよいのか?というような気がしてるのですが、一般的にそのあたりは許容されているものなのでしょうか?
Zuishin

2022/06/17 09:23

分岐を作るのではなく、依存性注入を行います。
退会済みユーザー

退会済みユーザー

2022/06/19 04:09

質問者さん、無言ですが、回答が出ているのでそれらに対するフィードバックをタイムリーに返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
guest

回答2

0

リポジトリパターンを考えてはいかがですか?

以下の画像は ASP.NET MVC でデータベースアクセスを行う場合ですが、質問者さんのケースでも応用は可能だと思います。

イメージ説明

出展: ASP.NET MVC 実践プログラミング (秀和システム)

投稿2022/06/17 09:48

編集2022/06/17 10:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

C#

1interface IAPI { 2 int method(); 3} 4 5/* 本番ではコレ使う */ 6class RealAPI : IAPI { 7 public int method() { return 0; /* return 外部APIを実行するメソッド(); */ } 8} 9 10// テスト対象 11class TestTarget { 12 IAPI api; 13 public void SetAPI(IAPI p) { api = p; } 14 15 public void 作成したAPI() { 16 System.Console.WriteLine("{0} が返ってきた", api.method()); 17 } 18} 19 20// テスト用のなんちゃってAPI 21class FakeAPI : IAPI { 22 public int result; 23 public void SetResult(int r) { result = r; } 24 public int method() { return result; } // result をそのまま返す 25} 26 27class Program { 28 static void Main() { 29 var target = new TestTarget(); 30 31 FakeAPI api = new FakeAPI(); // 本番では RealAPI を使う 32 target.SetAPI(api); 33 34 api.SetResult(123); 35 36 target.作成したAPI(); 37 } 38}

投稿2022/06/17 23:54

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2022/06/18 00:54 編集

それは私の回答で書いた「リポジトリパターン」というやつです。(実装はともかく基本的には) 同じ答えを書いてはいけないというルールはないかもしれませんが、あまり褒められたことではないかと。
episteme

2022/06/18 02:59 編集

おっしゃる通りです。 Zuishinさんのおっしゃる「依存性注入」(依存性逆転の原則)というやつです。 さらに言えば デザインパターンのひとつ「Strategy パターン」でもありますね。
退会済みユーザー

退会済みユーザー

2022/06/18 06:57

> Zuishinさんのおっしゃる「依存性注入」(依存性逆転の原則)というやつです。 いわゆる DI は私の回答では言及してません。
episteme

2022/06/18 07:18

ですね。DIはリポジトリパターン/Strategyパターンの"実現手段"でしょうから、 説明のレイヤが異なりますか。
退会済みユーザー

退会済みユーザー

2022/06/18 08:10 編集

DI の定義によると思います。例えば、DI の定義を「依存するオブジェクトを渡す」ということとすれば、上の私の回答の「リポジトリパターン」には DI を利用できるというだけで、オーバーラップする部分はあるかもしれませんがイコールではありません。 自分が知らないだけで、ひょっとしたら「リポジトリパターン」=「DI」という話もあるかもしれないということは否定できませんが。
akirakond

2022/06/19 15:54

ご回答ありがとうございます。 具体的な実装方法も記載いただきましたので、今回ベストアンサーとさせていただきました。 ご教示いただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問