将单元测试连接到本地IIS Web实例

时间:2011-08-10 15:07:59

标签: asp.net-mvc visual-studio unit-testing

我正在尝试为依赖于Web实例的项目运行单元测试,因为它使用集成的Windows身份验证来验证当前用户。当我运行测试时,它不会启动Web实例,这是预期的,但我需要它才能使任何测试真正成功。任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

好的,我最终得到了这个。你必须模拟HttpContextBase(我听到优先于HttpContext),然后设置从模拟对象返回的IPrincipal。我将提供完整的代码清单,以便您了解:

[TestInitialize]
public void SetUp()
{
    userRepositoryMock = new Mock<IUserRepository>();
    controller = new AccountController(userRepositoryMock.Object);

    httpContextMock = new Mock<HttpContextBase>();
    IPrincipal fakeUser = new GenericPrincipal(new GenericIdentity("johnsmith@johns4232mith.com", "Forms"), null);
    httpContextMock.Setup(x => x.User).Returns(fakeUser);

    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    var response = new Mock<HttpResponseBase>();
    var session = new Mock<HttpSessionStateBase>();
    var server = new Mock<HttpServerUtilityBase>();
    var identity = new Mock<IIdentity>();

    request.Setup(req => req.ApplicationPath).Returns("~/");
    request.Setup(req => req.AppRelativeCurrentExecutionFilePath).Returns("~/");
    request.Setup(req => req.PathInfo).Returns(string.Empty);
    response.Setup(res => res.ApplyAppPathModifier(It.IsAny<string>()))
        .Returns((string virtualPath) => virtualPath);
    identity.SetupGet(ident => ident.IsAuthenticated).Returns(true);
    context.Setup(ctx => ctx.Request).Returns(request.Object);
    context.Setup(ctx => ctx.Response).Returns(response.Object);
    context.Setup(ctx => ctx.Session).Returns(session.Object);
    context.Setup(ctx => ctx.Server).Returns(server.Object);
    context.Setup(ctx => ctx.User).Returns(fakeUser);

    controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
}