用户认证对抽象基类方法进行单元测试

时间:2013-06-03 11:15:49

标签: asp.net-mvc mocking nunit

我必须在下面的场景中为抽象基类方法编写测试用例:

     public abstract class baseclass{
     public bool MyBaseMethod(){
        if(User.Identity.IsAuthenticate)
         {.....}
       }
     }
     public class deriveclass: baseclass{
     }

在我的测试夹具类中,我有测试方法:

     [Test]
      public void MyBaseMethodtest()
      {
       SetUserIdentity(true);
       var obj = new deriveclass();
       var result = obj.MyBaseMethod();

       //test cases follows
       ..........
       }
      private void SetUserIdentity(bool login = false)
      {
        var identity = new Mock<ClaimsIdentity>() { DefaultValue = DefaultValue.Mock };
        if (login)
        {
            identity.Setup(p => p.IsAuthenticated).Returns(true);
        }
        var principal = new ClaimsPrincipal(identity.Object);
        var httpContext = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock };
        httpContext.SetupGet(x => x.User).Returns(principal);
        controller.ControllerContext = new ControllerContext(httpContext.Object, new RouteData(), controller);

    }

但是当我尝试引用MyBaseMethod时,它为User对象提供了null引用错误。我相信这是发生的,因为我为derivedclass设置controllercontext而不是基类。 我试图谷歌类似的情况,但找不到任何。

1 个答案:

答案 0 :(得分:4)

您正在使用moq,但是您需要在测试中使用的控制器实例上设置模拟,这似乎是在行var obj = new deriveclass();中创建的模拟器,因此当方法{{ 1}} SetUserIdentity将上下文分配给您要测试的实例。 (我假设baseclass和deriveclass是控制器)。

我已将controller.ControllerContext = ...baseclass创建为以下控制器。我在基类中添加了一个名为deriveclass的方法,该方法在用户通过身份验证时返回true,否则返回false:

FooMethod

然后您可以创建一个测试方法,如下所示(请注意,我将测试中的控制器传递给public abstract class FooController : Controller { public bool FooMethod() { if (User.Identity.IsAuthenticated) { return true; } return false; } } public class DerivedFooController : FooController { } 方法):

SetUserIdentity