iAt*_*_it 5 .net c# visual-studio-2010
我正在抓住这个小问题.
我在一个方法中有这一行和另外三个类似的行
try
{
int PhoneIMEINumber = int.Parse(Console.ReadLine());
}
{
catch(Exception)
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果用户输入"abcd"进行输入,则抛出异常,我可以捕获它并显示错误消息.
但是我该如何进行单元测试呢?我无法从单元测试中模拟控制台输入,我想从单元测试中检查是否返回了null.
谢谢
您可以Console.In使用SetIn设置为给定的文本阅读器:
var sr = new StringReader("Invalid int");
Console.SetIn(sr);
int? parsed = MethodUnderTest();
Assert.IsNull(parsed);
Run Code Online (Sandbox Code Playgroud)
如果你想单元测试Console那么你可能需要创建一个包装器接口.
public interface IConsole
{
string ReadLine();
}
public class ConsoleWrapper : IConsole
{
public string ReadLine()
{
return Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以创建Stub/Fake来测试业务规则.
public class TestableConsole : IConsole
{
private readonly string _output;
public TestableConsole(string output)
{
_output = output;
}
public string ReadLine()
{
return _output;
}
}
Run Code Online (Sandbox Code Playgroud)
测试内部:
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());
}
Run Code Online (Sandbox Code Playgroud)
我会尝试避免单元测试Console并依赖它.
就像发布的两条评论一样.我会考虑重构你的代码以寻找更像的东西
string input = Console.ReadLine();
try
{
int PhoneIMEINumber = parse_input(input);
}
catch(Exception)
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
然后你就有了一个功能
public int parse_input(string input)
{
return int.Parse(input);
}
Run Code Online (Sandbox Code Playgroud)
然后你要为这个parse_input功能编写一个单元测试.示例代码似乎相当简单,并且很难证明在int.Parse()的包装函数周围编写单元测试是合理的,但我假设您的解析在将来会变得更复杂.
| 归档时间: |
|
| 查看次数: |
5850 次 |
| 最近记录: |