测试断言失败:空引用异常。你调用的对象是空的

时间:2014-01-20 01:03:13

标签: c# asp.net-mvc nullreferenceexception object-reference objectinstantiation

好的,所以我有一行代码让我感到悲伤,但遗憾的是没有它,我的程序会中断。这是我能想到的唯一方法(除了完全重构我的程序)以做我想做的事情。

这一行的目的是选择要在其自己的范围之外运行的下一个类(在菜单中)。麻烦的是,类(Login)存在于菜单范围内。

以下是该行:

LoginView.Menu.SetMenuView();

任何人都可以提出更好的写作方法吗?

从技术上讲,该生产线没有任何问题,该程序顺利运行。但是当我运行测试时,测试因Null Reference Exception而失败。

以下是它出现的类:

控制器:

public void Show_Login(Menu_View Main_Menu)
    {
        // Creates an object of the User_LoginView.
        // Set the Parent Form of the Child window
        // Display the new form.
        User_LoginView LoginView = new User_LoginView(); 
        LoginView.MdiParent = Main_Menu;

        // This line changes the reference to the "Menu" variable for later use. 
        LoginView.Menu = Main_Menu;
        LoginView.Show(); 
    }

public static void Compare_Login(User_LoginView LoginView)
    {
        // Creates a new object 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 used for testing.
        screenAccess = AccessModel.AccessLevel;
        Menu_View.accessLevelSet = AccessModel.AccessLevel;

        // If the return is placed here, the assert passes, but the rest of the code 
        // becomes unreachable.
        // return;

        // 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);
            LoginView.Menu.SetMenuView();
            LoginView.Close();
            Menu_View.accessLevelSet = AccessModel.AccessLevel;
        }
        else
        {
            ErrorCodes_Controller LoginError = new ErrorCodes_Controller();
            LoginError.WrongLoginError();
        } 
    }

查看:

public partial class User_LoginView : Form
{
    // This is where the new reference is set, for when it gets called 
    // at the end of the Login Comparison.
    public Menu_View Menu { get; set; }
    public User_LoginView()
    {
        InitializeComponent();
    }

    private void btnLogin_Click(object sender, EventArgs e)
    {
        User_Controller.Check_Login(this);
    }
}

以下是测试:

    [TestMethod()]
    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);
    }

1 个答案:

答案 0 :(得分:3)

在您的测试方法中,您没有为 LoginView.Menu中执行的Show_Login()设置值。

因此,当您从测试中调用Compare_Login()时,Menu为空。

更改LoginView的构造函数以接受菜单并确保测试通过时,可能是值得的。