12

以下の関数は、ユーザーからの入力を取得します。を使用してこの関数をテストする必要がありますUnit Testing。ユーザー入力を動的に必要とするこの種の関数をテストする方法を教えてください。ありがとう

のようにboundary value analysis...

numberOfCommandsする必要があります(0 <= n <= 100)

public static int Get_Commands()
{
    do
    {
        string noOfCommands = Console.ReadLine().Trim();
        numberOfCommands = int.Parse(noOfCommands);             
    }
    while (numberOfCommands <= 0 || numberOfCommands >= 100);  

    return numberOfCommands;
}

プログラムによるヒントは大きな助けになります!

4

5 に答える 5

14

インターフェースを作成し、インターフェースを渡してテキストを受け取ります。次に、単体テストで、何らかの結果を自動的に返すモック インターフェイスを渡します。

コードの詳細を編集します。

public interface IUserInput{
    string GetInput();
}

public static int Get_Commands(IUserInput input){
    do{
       string noOfCommands = input.GetInput();
       // Rest of code here
    }
 }

public class Something : IUserInput{
     public string GetInput(){
           return Console.ReadLine().Trim();
     }
 }

 // Unit Test
 private class FakeUserInput : IUserInput{
      public string GetInput(){
           return "ABC_123";
      }
 }
 public void TestThisCode(){
    GetCommands(new FakeUserInput());
 }
于 2012-04-16T20:55:47.937 に答える
3

Console.SetIn()およびを使用しConsole.SetOut()て、入力と出力を定義できます。StringReaderを使用してテストの入力を定義し、StringWriterを使用して出力をキャプチャします。

より完全な説明と例については、このテーマに関する私のブログ投稿を参照してください:http: //www.softwareandi.com/2012/02/how-to-write-automated-tests-for.html

于 2012-04-18T11:41:02.420 に答える
3

2 つの重要なこと:

  1. Console.ReadLineは外部依存関係であり、何らかの方法でメソッドに提供する必要があります (できれば依存性注入を介して)
  2. Console.ReadLine内部で基本クラスを使用してTextReaderおり、それが提供されるべきものです

したがって、メソッドに必要なのは依存関係TextReaderです (カスタム インターフェイスを使用してさらに抽象化することもできますが、テストの目的では十分です)。

 public static int Get_Commands(TextReader reader)
 {
     // ... use reader instead of Console
 }

Get_Commands実際のアプリケーションでは、実際のコンソールを使用して呼び出します。

    int commandsNumber = Get_Commands(Console.In);

単体テストでは、StringReaderクラスの例を使用して偽の入力を作成します。

[Test]
public void Get_Commands_ReturnsCorrectNumberOfCommands()
{
   const string InputString = 
       "150" + Environment.NewLine + 
       "10" + Environment.NewLine;
   var stringReader = new StringReader(InputString);

   var actualCommandsNumber = MyClass.Get_Commands(stringReader);

   Assert.That(actualCommandsNumber, Is.EqualTo(10));
}
于 2012-04-17T10:24:30.153 に答える
1

入力をファイルから標準入力にリダイレクトし、それをテストで使用できます。これは、プログラム自体でプログラムによって行うことも、プログラムを実行するシェルを通じて行うこともできます。

また、すべての「ユーザー入力」を独自のクラス/関数に推定して、「ユーザーからテキスト行を取得する」関数を「テスト用にこのハードコードされた文字列を返す」関数に簡単に置き換えることもできます。これらの関数のそれぞれが共通のインターフェイスを実装するクラスにある場合、それらを簡単に切り替えることができます。

于 2012-04-16T20:56:01.260 に答える
-1

Main() では、次のことができます。

int testCommand=Get_Commands();
Console.WriteLine(testCommand);

ただし、それがあなたが望んでいたタイプのテストであるかどうかはわかりません。単純に関数の結果をテストする以上の問題はありますか?

于 2012-04-16T20:58:49.053 に答える