首页 > 解决方案 > 寻找有关我的单元测试用例逻辑 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();
    }

标签: c#visual-studiounit-testingconsole-application

解决方案


好的,所以你的问题有几点。首先,让我们稍微清理一下代码:

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 中为您处理的,使用该方法的理由很少。


推荐阅读