Как выполнить модульное тестирование класса, который использует класс консоли? - PullRequest
0 голосов
/ 07 января 2019

У меня есть класс, который использует Console класс и устанавливает эти переменные в конструкторе.

  public Scene() {
        Height = Console.WindowHeight;
        Width = Console.WindowWidth;
    } 

и тестовый класс, который тестирует этот конструктор:

public class SceneTests {
    [Fact]
    public void Contructor_None_ShouldReturnScene() {
        var testScene = new Scene();
        Assert.Equal(Console.WindowHeight, testScene.Height);
        Assert.Equal(Console.WindowWidth, testScene.Width);
    }
}

Но во время этого теста у меня есть исключение:

Exception has occurred: CLR/System.IO.IOException
An exception of type 'System.IO.IOException' occurred in System.Console.dll but was not handled in user code: 'Nieprawidłowe dojście'
at System.ConsolePal.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded)
at System.ConsolePal.get_WindowHeight()
at System.Console.get_WindowHeight()

Полагаю, это потому, что у меня нет фактического Console окна.

Могу я как-нибудь смоделировать это? Возможно, простое создание буфера вручную и добавление его в Console решит проблему.

1 Ответ

0 голосов
/ 07 января 2019

обычным образом ...

Создайте интерфейс, который описывает ваш доступ к консоли. Реализуйте этот интерфейс в классе, который просто использует System.Console. Добавьте это в ваш работающий код, используя ваш любимый механизм «Dependency Injection».

Затем создайте другой класс для использования во время тестирования, который реализует тот же интерфейс, но без использования класса System.Console (например, просто жестко закодируйте свойства WindowHeight и WindowWidth, чтобы Console.ReadLine всегда возвращал одну и ту же строку, напишите Console.Write или WriteLine в другое место). Вставьте этот класс в код модульного теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...