2

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

     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 对象提供空引用错误。我相信这正在发生,因为我正在为派生类而不是基类设置控制器上下文。我试图用谷歌搜索类似的场景,但找不到。

4

1 回答 1

4

您正确使用了最小起订量,但是您需要在测试中使用的控制器实例上设置模拟,这似乎是在该行中创建的那个var obj = new deriveclass();,因此当方法SetUserIdentity执行时controller.ControllerContext = ...将上下文分配给您想要的实例去测试。(我假设基类和派生类是控制器)。

我创建了以下控制器作为您的baseclassderiveclass. 我添加了一个在基类中命名的方法FooMethod,当用户通过身份验证时返回 true,否则返回 false:

public abstract class FooController : Controller
{
    public bool FooMethod()
    {
        if (User.Identity.IsAuthenticated)
        {
            return true;
        }
        return false;
    }
}

public class DerivedFooController : FooController
{
}

然后,您可以按如下方式创建一个测试方法(注意我正在将被测控制器传递给该SetUserIdentity方法):

[Test]
public void FooMethodTest_ReturnsTrue_WhenUserIsAuthenticated()
{
    //Arrange
    var controllerUnderTest = new DerivedFooController();
    SetUserIdentity(controllerUnderTest, true);

    //Act
    var result = controllerUnderTest.FooMethod();

    //Asert
    Assert.IsTrue(result);
}

private void SetUserIdentity(ControllerBase controller, 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);

}
于 2013-06-03T12:22:51.340 回答