我必须在下面的场景中为抽象基类方法编写测试用例:
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而不是基类。 我试图谷歌类似的情况,但找不到任何。
答案 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