如果你想单元测试Console
,那么你可能需要创建一个包装接口。
public interface IConsole
{
string ReadLine();
}
public class ConsoleWrapper : IConsole
{
public string ReadLine()
{
return Console.ReadLine();
}
}
这样您就可以创建一个存根/假来测试您的业务规则。
public class TestableConsole : IConsole
{
private readonly string _output;
public TestableConsole(string output)
{
_output = output;
}
public string ReadLine()
{
return _output;
}
}
测试内部:
public class TestClass
{
private readonly IConsole _console;
public TestClass(IConsole console)
{
_console = console;
}
public void RunBusinessRules()
{
int value;
if(!int.TryParse(_console.ReadLine(), out value)
{
throw new ArgumentException("User input was not valid");
}
}
}
[Test]
public void TestGettingInput()
{
var console = new TestableConsole("abc");
var classObject = new TestClass(console);
Assert.Throws<ArgumentException>(() => classObject.RunBusinessRules());
}
我会试图避免单元测试Console
,并承担它的依赖性去。
您可能不应该单元测试控制台,而是测试业务规则。 – Romoku
单元测试的一大优点是它可以让你重新评估你的设计。你现在应该这样做并重构你的代码。目前,ReadLine与业务/验证代码紧密耦合。 –
@HenkHolterman汉克,我有一个场景,我想测试一个方法,分析我的计算机上的文件,这是由用户通过'Console.ReadLine()'指定的。这应如何处理? – alex