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

寻找关于我的单元测试用例逻辑c#控制台应用程序的建议,c#,visual-studio,unit-testing,console-application,C#,Visual Studio,Unit Testing,Console Application,我只是想让我的代码进行逻辑审查。我认为这是我所期望的,但我想和更精通C#的同龄人再核实一下 因此,我在这里测试一个控制台应用程序,它验证用户输入。我正在使用StringReader模拟用户响应。所以我输入了5作为我的响应,如果我的响应不是一个有效的浮点,那么我将收到一个错误 我针对一个非浮点值进行了测试,for循环导致我输入了一个内存不足异常,这是有意义的。但出于某种原因,在我的测试中,我觉得我在写我的Input1()函数,只是验证我的输入是否确实是我模拟的值?或者我的测试实际上是在验证Inpu

我只是想让我的代码进行逻辑审查。我认为这是我所期望的,但我想和更精通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中为您处理的,很少有理由使用该方法。

If*语句。不是循环。对不起,谢谢你,天鹰。现在看一个关于依赖注入的图坦卡蒙。将尝试应用于我的代码。但基本上DI是为了使我的代码解耦,对吗?我正在运行的测试仍将执行与现在相同的测试?我仍然只能测试阳性,而不能测试阴性。DI只是为了更好的编程实践,对吗?是的,它主要用于解耦,并且倾向于使单元测试更容易和更干净。这是一个几乎每个开发人员都应该学习和理解的主题。