Пример, когда платят за строку кода :)
Код абсолютно НЕ тестопригодный, вы постарались.
На ввод с клавиатуры юнит-тест не нужен. Нужен юнит-тест на метод, который производит с этим вводом какие-либо действия. Основная логика у вас происходит именно в Threadmain() - методе, который ничего не принимает и ничего не возвращает, кроме возможных исключений.
1. Зачем ввод с клавиатуры в отдельном потоке, да ещё и с очередью, если ReadLine() блокирующий метод.
2. Convert.ToInt32() выдаст исключение, если аргументом будет строка, не содержащая цифры.
3.
num == "q" || num == "Q"
- есть методы .ToLower(), ToUpper(). Название переменной num абсолютно нелогично, если оно не числовое.
4. Ещё тестом надо покрыть PumpMessage(), чтобы проверить, выходит ли программа из цикла
UPD: Вот рефактор, который делает более-менее то же самое, и его можно тестировать:
using System;
using System.Linq;
using System.Collections.Generic;
class Program {
static List<int> _numbers = new List<int>();
static void Main() {
while(UserInput(Console.ReadLine()));
Console.WriteLine($"Sum is: {CalcSum(_numbers)}");
}
static bool UserInput(string input)
{
if(string.IsNullOrEmpty(input)) return false;
if(!int.TryParse(input, out int number)) return false;
_numbers.Add(number);
return true;
}
static int CalcSum(IEnumerable<int> numbers)
{
return numbers.Sum();
}
}
Тесты для UserInput
UserInput получает на вход null и должен вернуть false
UserInput получает на вход "" и должен вернуть false
UserInput получает на вход что угодно, кроме числа и должен вернуть false
UserInput на вход число и возвращает true
Тесты для CalcSum
Получает на вход пустой список и возвращает 0
Получает на вход массив [1, 2] возвращает 3
(ну для пущей надёжности можно ещё добавить проверку входящего аргумента на null) и проверить, выбрасывается ли исключение