如果你想單元測試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