Как провести модульное тестирование этого метода с C # - PullRequest
0 голосов
/ 16 августа 2011

У меня есть следующий метод, который я хочу выполнить модульный тест.Можно изменить подпись метода:

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());
    });
}

У меня есть собственное решение, но я хочу выяснить, является ли моя версия лучшей.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 16 августа 2011

Чтобы выполнить модульное тестирование этого метода, вам нужно обернуть 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.

2 голосов
/ 16 августа 2011

Вот способ переписать ваш метод

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 включает в себя сначала написание тестов.Что вы можете сделать, это написать тесты, а затем refactor , чтобы тесты работали.

1 голос
/ 16 августа 2011

Если вы имеете в виду модульный тест, вы сможете проверить только выходные данные, так как метод не имеет ввода. Я бы переписал подпись как:

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

и затем при прохождении теста что-то вроде StreamWriter подключается к MemoryStream. После вызова метода из тестового метода выходные данные должны быть записаны в MemoryStream, и вы можете проверить, что он выдал ожидаемый результат.

РЕДАКТИРОВАТЬ: Пропускать добавление, в производстве, если вы действительно хотите, чтобы он записывал в консоль, вызовите его следующим образом:

PrintNumber(Console.Out);
...