-3

単体テストを実行したい次のメソッドがあります。メソッドのシグネチャは次のように変更できます。

public void PrintNumber()
{
    Enumerable.Range(1, 100).ToList().ForEach(x =>
    {
        if (x % 3 == 0 && x % 5 == 0)
            Console.WriteLine("[35]");
        else if (x % 3 == 0)
            Console.WriteLine("[3]");
        else if (x % 5 == 0)
            Console.WriteLine("[5]");
        else
            Console.WriteLine(x.ToString());
    });
}

私は独自の解決策を持っていますが、私のバージョンが最適かどうかを知りたいです。

ありがとう!

4

3 に答える 3

8

このメソッドの単体テストを行うにConsole.WriteLine()は、プロキシクラスでラップし、そのクラスをメソッドに挿入する必要があります。

public interface IWriter
{
    void Write(string text);
}

public class ConsoleWriter : IWriter
{
    public void Write(string text)
    {
       Console.WriteLine(text);
    }
}

public class StubWriter : IWriter
{
    List<string> values = new List<string>();
    public void Write(string text)
    {
         values.Add(text);
    }

    public List<string> Values { get { return values; } }
}

この構造を使用して、メソッドのシグネチャをに変更しPrintNumber(IWriter writer)、ライターを呼び出します。テストメソッドでは、を注入しStubWriter、本番環境では、を注入しConsoleWriterます。

于 2011-08-16T01:45:37.267 に答える
2

メソッドを書き直す方法は次のとおりです

public void PrintNumber(TextWriter writer, 
               Action<TextWriter, int> modHandler) {... }

public void HandleMod(TextWriter writer, int input) {...}

そしていくつかのテスト:

void Print_Number_Should_Enumerate_0to100 {...}
void Handle_Mod_Outputs_35_Only_When_Input_35 {...}
void Handle_Mod_Gets_Mod_3_Correct {...}
void Handle_Mode_Gets_Mod_5_Correct {...}
void Handle_Mode_Defaults_To_Outputting_Input {...}

等々。

ただし、これをTDDすることはできません。すでに作成されています。 TDDには、最初にテストを作成することが含まれます。あなたができることは、テストを書いて、テストを機能させるためにリファクタリングすることです。

于 2011-08-16T01:49:56.893 に答える
1

単体テストを意味する場合、メソッドには入力がないため、出力を検証することしかできません。署名を次のように書き直します。

public void PrintNumber(TextWriter writer) // use writer.WriteLine instead of console.WriteLine

次に、テスト パスで、MemoryStream にフックされた StreamWriter のようなものを渡します。テスト メソッドからメソッドを呼び出した後、出力が MemoryStream に書き込まれ、期待どおりの出力が生成されたことを検証できます。

編集:追加するのを怠りました。本番環境で、コンソールに書き込む必要がある場合は、次のように呼び出します。

PrintNumber(Console.Out);
于 2011-08-16T01:42:44.080 に答える