1. ホーム
  2. c#

[解決済み】voidメソッドのユニットテスト?

2022-04-13 12:46:26

質問

何も返さないメソッドをユニットテストする最良の方法は何でしょうか?特にc#で。

私が本当にテストしようとしているのは、ログファイルを受け取り、特定の文字列のためにそれを解析するメソッドです。文字列は、その後、データベースに挿入されます。以前から行われていないことはありませんが、TDDに非常に慣れていないため、これをテストすることが可能かどうか、または実際にテストされないものであるかどうか疑問に思っています。

どのように解決するのですか?

メソッドが何も返さない場合、以下のどちらかです。

  • 必須 - オブジェクトにそれ自身に対して何かをするように要求している。例えば、状態を変更する(確認を期待せずに。)
  • 情報提供 - それぞれ、何かが起こったことを(行動や反応を期待せずに)誰かに通知すること。

Imperativeメソッド - タスクが実際に実行されたかどうかを検証することができます。状態変化が実際に起こったかどうかを検証する。

void DeductFromBalance( dAmount ) 

このメッセージの後の残高が本当に初期値より少ないかどうかは、dAmount で確認することができます。

情報提供メソッド - オブジェクトのパブリックインターフェイスのメンバーであることは稀です...したがって、通常ユニットテストは行われません。しかし、もし必要であれば、notificationに対して行われるべき処理が行われたかどうかを検証することができます。

void OnAccountDebit( dAmount )  // emails account holder with info

は、メールが送信されているかどうかを確認することでテストできます。

実際の方法についてもっと詳細を投稿すれば、より良い回答が得られるでしょう。

アップデート : あなたのメソッドは2つのことを行っています。私は実際にそれを2つのメソッドに分割し、独立してテストすることができます。

string[] ExamineLogFileForX( string sFileName );
void InsertStringsIntoDatabase( string[] );

String[]は、最初のメソッドにダミーファイルと期待される文字列を提供することで簡単に検証することができます。2つ目は少し厄介です。DBを模倣するモック(googleやstackoverflowでモッキングフレームワークを検索)を使うか、実際のDBを叩いて文字列が正しい位置に挿入されているかどうかを確認します。チェック このスレッド 良い本があれば教えてください。もし、あなたが困っているのなら、Pragmatic Unit Testingを推薦します。

コードでは、次のように使用します。

InsertStringsIntoDatabase( ExamineLogFileForX( "c:\OMG.log" ) );