C# 用户信息如何从UnitTest传递到controller?

C# 用户信息如何从UnitTest传递到controller?,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,在上面的代码中,如何使WebSecurity.Login调用工作 我做了研究,但没用 谢谢。您不想测试Web安全性,只想测试您自己的代码-因此您需要一种方法来测试控制器操作,而不提供真正的Web安全性类 有很多方法可以做到这一点,但根据你问题的性质判断,我认为你需要尽可能最简单的方法(而不是最优雅的方法),在这种情况下,我建议你不要实际测试控制器动作及其所有相关的MVC管道,而是拿出你的逻辑并进行测试,例如: [TestMethod] public void UnitTestMethod1()

在上面的代码中,如何使WebSecurity.Login调用工作

我做了研究,但没用


谢谢。

您不想测试Web安全性,只想测试您自己的代码-因此您需要一种方法来测试控制器操作,而不提供真正的Web安全性类

有很多方法可以做到这一点,但根据你问题的性质判断,我认为你需要尽可能最简单的方法(而不是最优雅的方法),在这种情况下,我建议你不要实际测试控制器动作及其所有相关的MVC管道,而是拿出你的逻辑并进行测试,例如:

[TestMethod]
public void UnitTestMethod1()
{
   Test1Controller controller = new Test1Controller();

   //This call throws NullReferenceException "Object reference not set to an instance of    an object." 
   WebSecurity.Login("User1", "password1");

   controller.TestMethod(); 
} 
然后在您的测试类中,您只需测试
Test1Controller.MyLogicHere
(不需要Web安全性)


要么就是这样,要么就是真正掌握DI、接口、模拟等等。

谢谢你,尼尔。WebSecurity.Login使用FormsAuthentication.SetAuthCookie,这实际上会引发异常。但是MyLogicHere使用WebMatrix.WebData.WebSecurity.CurrentUserId。整个想法是Test1Controller.SomeMethod()使用WebMatrix.WebData.WebSecurity.CurrentUserId来获取id。然后可以将该id传递给MyLogicHere()并测试MyLogicHere()很容易,因为您只引用CurrentUserId而不引用WebSecurity,所以必须更改代码以传递CurrentUserId,这样会降低单元测试的价值。
public Test1Controller
{
      public ActionResult SomeMethod()
      {
            //do mvc stuff

            //do WebSecurity stuff  

            //do your stuff
            MyLogicHere();
      }

    //public only so it can be tested
    public MyLogicHere()
    {
        //the logic in here does not have dependencies on difficult to test types 
    }
}