如何对使用Console类的类进行单元测试?

时间:2019-01-07 15:30:32

标签: c# terminal .net-core

我有一个类,它使用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);
    }
}

但是在运行此测试时,我得到了Exeption:

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 :(得分:5)

以通常的方式...

创建一个描述您对控制台的访问的界面。在只使用System.Console的类中实现该接口。使用您最喜欢的“依赖注入”机制将其注入正在运行的代码中。

然后创建另一个在测试期间使用的类,该类实现相同的接口,但不使用System.Console类(例如,简单地硬编码WindowHeight和WindowWidth属性,让Console.ReadLine始终返回相同的字符串, Console.Write或WriteLine到其他地方)。将该类注入单元测试代码中。