C# 为什么我的断言失败了?(引发异常)

C# 为什么我的断言失败了?(引发异常),c#,asp.net-mvc,testing,C#,Asp.net Mvc,Testing,我在代码中使用测试,据我所知,在方法中运行测试所需的全部内容如下: private ClassName(Argument) { return; } 因此,测试实际检查的是“参数”是否是方法/测试结束时的正确输出 但是在我的例子中,传入的参数与输出无关。因此,我不确定如何测试它 注意:代码本身是正确的,它输出正确的变量。另外,我实际上是在代码完成后编写测试的(我知道,我想养成经常测试的习惯。) 编辑:我认为问题与通过LoginView.Close和LoginView.Menu.SetMe

我在代码中使用测试,据我所知,在方法中运行测试所需的全部内容如下:

private ClassName(Argument)
{
    return;
}
因此,测试实际检查的是“参数”是否是方法/测试结束时的正确输出

但是在我的例子中,传入的参数与输出无关。因此,我不确定如何测试它

注意:代码本身是正确的,它输出正确的变量。另外,我实际上是在代码完成后编写测试的(我知道,我想养成经常测试的习惯。)

编辑:我认为问题与通过
LoginView.Close
LoginView.Menu.SetMenuView退出测试有关。(功能在此行结束,测试无法完成?)

返回的位置
也会影响代码的其余部分,因此它需要位于代码的末尾。如果我把它向上移动,剩下的代码将无法访问,程序将中断

我一直在寻找尝试绕过异常的方法,我所想到的就是测试异常是否被正确抛出是否有办法绕过测试中的异常?

以下是测试:

public void Compare_LoginTest()
{
    User_LoginView LoginView = new User_LoginView();
    User_Controller.screenName = "ben";
    User_Controller.screenPwd = "password";
    User_Controller.Compare_Login(LoginView);
    int actual = User_Controller.screenAccess;
    int expected = 1;
    Assert.AreEqual(expected, actual);
}
以下是正在测试的方法:

    public static  void Compare_Login(User_LoginView LoginView)
    {
        // Creates a new oject of User_Model and populates it from the User_Controller.
        User_Model AccessModel = new User_Model();
        AccessModel.Name = screenName;
        AccessModel.Pwd = screenPwd;

        // Runs the Login Comparsion in the Database_Facade, and passes in the Model.
        Database_Facade Database = new Database_Facade();
        Database.GetLoginAccess(AccessModel);
        screenAccess = AccessModel.AccessLevel;
        Menu_View.accessLevelSet = AccessModel.AccessLevel;

        // Compares the returned AccessLevel. 
        // if it is corect; closes the Login and runs the SetMenuView method,
        // if it is incorrect; shows an error.
        if (AccessModel.AccessLevel > 0)
        {
            Console.WriteLine("Access Level " + AccessModel.AccessLevel);
            // Exception Thrown in testing.
            LoginView.Close();
            LoginView.Menu.SetMenuView();
        }
        else
        {
            ErrorCodes_Controller LoginError = new ErrorCodes_Controller();
            LoginError.WrongLoginError();
        }
        return;
    }

我不明白你在问什么。。。如果静态
UserController.screenAccess
变量为1,并且
Compare\u Login
方法似乎总是将其设置为1,则测试将通过

这一切看起来都很好,所以如果测试失败,那么代码就无法达到这一点

对于大多数单元测试框架(我猜您只是在使用内置的microsoft框架?),异常是单元测试方法通过或失败的方式-如果断言不正确,则
Assert.Xyz
方法会抛出异常,否则不会。您的代码可能抛出的任何其他异常也被视为失败。 测试框架捕获任何异常,如果没有异常,则将测试标记为已通过


我猜
Check\u Login
函数或
Compare\u Login
函数的早期部分中的某些内容引发了异常。这是我能看到的唯一一件会导致单元测试失败的事情。但是,我很惊讶您没有注意到这样一个异常(尝试单击失败的单元测试,看看您可以看到关于失败的详细信息)

您应该将其分解为执行离散任务(例如验证密码)的较小函数并对其进行测试。听说过正则表达式吗?那么到底发生了什么?您希望人们在浏览器中调试您的代码吗?我看到stackoverflow正在变成“makemyhomeworkforme.com”。@Peri我明白你的意思,但我不是要你帮我解决这个问题。我是一个业余爱好者,学习曲线非常陡峭,所以我想了解Visual Studio中的测试是如何工作的,我只是将我的代码用作参考。@Peri这是非常正确的。很抱歉造成混淆
screenAccess
变量是一个伪变量,用于查看测试正在执行的操作。我还查看了代码,发现
LoginView.Close()
LoginView.Menu.SetMenuView()
都引发了异常(我不知道为什么?),但是如果移动
会返回向上,代码的其余部分将无法访问。这就是原因。异常是导致测试失败的原因。如果向上移动
return
,则函数在
LoginView.Close()运行之前退出,因此它不会抛出异常(因此测试将通过)。修复异常,它应该是正常的。为什么会有例外?谁知道呢。我不知道您使用的库是哪种类型的框架,所以问题是在
返回之前退出测试造成的?i、 e.
LoginView.Close
LoginView.Menu.SetMenuView
,因为使用的参数是
LoginView
。但正如我之前所说,如果我向上移动
return
,则代码的其余部分将无法访问。否,问题是由Close或SetMenuView函数引发异常引起的。我不认为您的断言失败了,我认为它可能还没有达到那个程度——只要其中一个函数抛出异常,测试就会立即退出。如果向上移动
返回
,则这些函数永远不会运行,因此没有异常-然后您的断言可以检查
屏幕访问
是否为1,并通过