寻找有关我的单元测试用例逻辑 c# 控制台应用程序的建议

Looking for advice on my unit test case logic c# console application

我只是想出于逻辑目的审查我的代码。我认为它按照我期望的方式运行,但我想与更精通 C# 的同行核实一下。

所以我在这里测试一个验证用户输入的控制台应用程序。我正在使用 StringReader 来模拟用户响应。所以我输入了 5 作为响应,如果我的响应不是有效的浮点数,那么我应该会收到错误消息。

我针对非浮点值进行了测试,我的 for 循环导致我输入内存不足异常,这是有道理的。但出于某种原因,在我的测试中,我觉得我正在写我的 Input1() 函数,只是验证我的输入确实是我模拟的值?还是我的测试实际上验证了 Input1() 的 return 值实际上是浮点数形式的 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;
}

与其说这是一个单元测试,不如说这是一个集成测试。通常在单元测试中,您正在测试特定 class 或方法的逻辑。在这种情况下,您将引入外部库并对其进行测试。

在这种情况下,阴性测试是行不通的。测试将以无限循环结束,如您所见,最终将 运行 内存不足。

如果你真的想测试这样的东西,可能是你正在寻找的答案,你最好使用依赖注入并创建一个包装器 class 并模拟库调用。这样您就可以更好地控制测试流程。

看来您可能正在尝试学习测试驱动开发。我鼓励您仔细阅读需要测试的内容和不需要的内容。很多人在开始进行单元测试时会不知所措,并通过正面测试、负面测试、过多的模拟,甚至外部库测试来寻找 100% 的代码覆盖率。通常不需要这种级别的测试。测试什么时候有意义。

顺便说一句,你不应该在那种情况下调用 GC.Collect。垃圾回收是在 .NET 中为您处理的,很少有理由使用该方法。