如何在c#Mvc中编写单元测试?方法有会话

如何在c#Mvc中编写单元测试?方法有会话,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,我犯了以下错误 中发生“System.NullReferenceException”类型的异常 工作量估算.dll,但未在用户代码中处理 信息:对象引用未设置为对象的实例。“ 在控制器中,我有一个名为Login的方法。在这种方法中,我们使用会话。那么如何编写单元测试呢?在运行单元测试代码时,它转到主csharp代码并输入方法,并在会话声明中停止。 任何一个知道解决方法的人都要尽快解决它 我的单元测试代码,我尝试过的是,LoginModelclass有两个变量,我在那里分配了 [TestMetho

我犯了以下错误

中发生“System.NullReferenceException”类型的异常 工作量估算.dll,但未在用户代码中处理 信息:对象引用未设置为对象的实例。“

在控制器中,我有一个名为Login的方法。在这种方法中,我们使用会话。那么如何编写单元测试呢?在运行单元测试代码时,它转到主csharp代码并输入方法,并在会话声明中停止。 任何一个知道解决方法的人都要尽快解决它

我的单元测试代码,我尝试过的是,LoginModelclass有两个变量,我在那里分配了

[TestMethod]
public void Login1() //Bug
{
    LoginController log = new LoginController();
    LoginModel logModel = new LoginModel ();
    logModel.UserName = "20079199";
    logModel.Password = "123456";
    var result = log.Login(logModel) as ViewResult;
    Assert.AreEqual("HomePage", result);

}

[HttpPost]
public ActionResult Login(LoginModel lVM)
{
    LoginViewModel model = UM.Authentication(lVM);
    if (model.UserId > 0)
    {
        Session["LoginMessage"] =  model.UserName;
        Session["UserID"] = model.UserId;

        IDataHelper ex = new DataHelper();

        return RedirectToAction("HomePage", "Newcontroller");
    }
    else
    {
        Session["LoginMessage"] = "Invalid UserName and Password";
        return RedirectToAction("Login", "Login");
    }
}

我想你有三个选择:

1) 使用HttpContextBase并模拟您需要在控制器中执行的操作

2) 创建从LoginController继承的可测试LoginController,例如

公共类TestAbleLoginController:LoginController{}

完成此操作后,将在新方法中设置会话的代码包装起来,然后在可测试控制器中重写该方法,以便在不需要会话时不设置会话

e、 g

protected internal override SetLoginInfo(){//do nothing}

而实际的代码是这样的

protected virtual SetLoginInfo(){ Session["LoginMessage"]...}
3) 包装代码以访问另一个对象中的会话,并通过构造函数将其注入。因此,您可以根据需要定义一个像IUserSession这样的接口,然后在测试中模拟这个接口,这样它就不会执行类似的操作

var userSession = MockRepository.GenerateStub<IUserSession>();
var userSession=MockRepository.GenerateStub();

我会说:为什么要测试这个方法?我个人不会费心的。不过,Eddie Paz的链接回答了您的问题。@A.Chiesa-我的TL告诉我对控制器中的所有方法进行单元测试。执行单元测试时,在控制器中的方法中显示一些错误。这就是“空引用异常。对象引用未设置对象实例”如果有人愿意为无用的测试付费,那么就去做吧!你的问题的正确答案在埃迪·帕兹的评论中。如果您不知道NullReferenceException是什么,那么您必须稍微研究一下。您可以从这里开始:和:result将为null,无论:log.Login(logModel)作为ViewResult生成null。因为它不是返回一个ViewResult,而是一个RedirectToAction。你能告诉我更多关于第2步的信息吗,也许还有更多的代码示例?