c# - 寻找有关我的单元测试用例逻辑 c# 控制台应用程序的建议
问题描述
我只是想让我的代码出于逻辑目的进行审查。我认为它的工作方式符合我的预期,但我想与更精通 C# 的同行再次确认。
所以在这里我正在测试一个验证用户输入的控制台应用程序。我正在使用 StringReader 来模拟用户响应。所以我输入 5 作为我的回复,如果我的回复不是有效的浮点数,那么我应该收到一个错误。
我针对非浮点值对此进行了测试,我的 for 循环导致我输入了内存不足异常,这是有道理的。但出于某种原因,在我的测试中,我觉得我正在写我的 Input1() 函数并且只是验证我的输入确实是我模拟的值?还是我的测试实际上验证了 Input1() 的返回值实际上是浮点数形式的 num1 - 从而通过了我的验证?
对不起,如果这是矫枉过正并且没有意义。
public float Input1()
{
//Console.WriteLine("Type a number, and then press Enter");
bool Valid = false;
while (Valid == false)
{
//bad implementation here: Input = Input;
String Input = Console.ReadLine();
Console.WriteLine(Input);
if (!float.TryParse(Input, out Number))
{
Console.WriteLine("Not an integer, please try again.");
}
else
{
Valid = true;
num1 = (float)Convert.ToDecimal(Input);
}
}
return num1;
}
[Test]
public void Test2()
{
var calc = new CalculatorApp.Program();
var output = new StringWriter();
float num1;
float expectedresult;
Console.SetOut(output);
var input = new StringReader("5");
Console.SetIn(input);
calc.Input1();
//num1 = (float)Convert.ToDecimal(output);
Assert.That(output.ToString(), Is.EqualTo(string.Format("5\r\n", Environment.NewLine)));
GC.Collect();
}
解决方案
好的,所以你的问题有几点。首先,让我们稍微清理一下代码:
public float GetNumberFromUser()
{
float result;
while (!float.TryParse(Console.ReadLine(), out result))
{
System.Console.WriteLine("Please enter a valid number...");
}
return result;
}
这与其说是一个单元测试,不如说是一个集成测试。通常在单元测试中,您正在测试特定类或方法的逻辑。在这种情况下,您将引入外部库并对其进行测试。
在这种情况下,阴性测试是行不通的。测试将进入无限循环,正如您所见,最终会耗尽内存。
如果你真的想测试这样的东西,并且可能是你正在寻找的答案,你最好使用依赖注入并创建一个包装类并模拟库调用。这样您就可以更好地控制测试流程。
看起来您可能正在尝试学习测试驱动开发。我鼓励您阅读需要测试的内容和不需要测试的内容。很多人在开始进行单元测试并通过正面测试、负面测试、过多模拟,甚至外部库测试来寻找 100% 的代码覆盖率时,都被迷住了。通常不需要这种级别的测试。在有意义的时候进行测试。
顺便说一句,你不应该在这种情况下调用 GC.Collect。垃圾收集是在 .NET 中为您处理的,使用该方法的理由很少。
推荐阅读
- javascript - 为什么要为第三方 JS 使用异步加载器
- sql - 使用 SQL 在另一个表中插入已排序的行
- flutter - Flutter GetX 状态管理按钮单击
- python - 带有退格问题的 unicode 中的 Python 输入
- jwt - NextAuth Hasura 刷新令牌
- mysql - Laravel查询查找所有注册用户的总视图计数过去7天的每一天
- sequelize.js - 如何在sequelize中按ID排序
- makefile - Make没有意识到它已经完成了
- mysql - 数据库设计:X:X to 1:many vs X:X to 0:many
- javascript - 不带符号的 yup 字符串验证