Asp.net mvc 将单元测试连接到本地IIS Web实例

Asp.net mvc 将单元测试连接到本地IIS Web实例,asp.net-mvc,visual-studio,unit-testing,Asp.net Mvc,Visual Studio,Unit Testing,我正在尝试为一个依赖于web实例的项目运行单元测试,因为它使用集成的windows身份验证来验证当前用户。当我运行测试时,它不会启动web实例,这是预期的,但我需要它,以便任何测试真正成功。有人知道怎么做吗?好的,我终于成功了。您必须模拟HttpContextBase(这比我听说的HttpContext更优先),然后设置从模拟对象返回的IPrincipal。我将给出完整的代码清单,以便您了解: [TestInitialize] public void SetUp() { userRepo

我正在尝试为一个依赖于web实例的项目运行单元测试,因为它使用集成的windows身份验证来验证当前用户。当我运行测试时,它不会启动web实例,这是预期的,但我需要它,以便任何测试真正成功。有人知道怎么做吗?

好的,我终于成功了。您必须模拟
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);
}
[测试初始化]
公共作废设置()
{
userRepositoryMock=newmock();
控制器=新的AccountController(userRepositoryMock.Object);
httpContextMock=new Mock();
IPrincipal fakeUser=新的GenericPrincipal(新的GenericEntity(“johnsmith@johns4232mith.com“,”表格“),无效);
httpContextMock.Setup(x=>x.User).Returns(fakeUser);
var context=newmock();
var request=newmock();
var response=newmock();
var session=newmock();
var server=newmock();
var identity=newmock();
request.Setup(req=>req.ApplicationPath)。返回(“~/”;
Setup(req=>req.AppRelativeCurrentExecutionFilePath)。返回(“~/”;
request.Setup(req=>req.PathInfo).Returns(string.Empty);
response.Setup(res=>res.ApplyAppPathModifier(It.IsAny()))
.返回((字符串virtualPath)=>virtualPath);
identity.SetupGet(ident=>ident.IsAuthenticated).返回(true);
Setup(ctx=>ctx.Request).Returns(Request.Object);
Setup(ctx=>ctx.Response).Returns(Response.Object);
Setup(ctx=>ctx.Session).Returns(Session.Object);
Setup(ctx=>ctx.Server).Returns(Server.Object);
Setup(ctx=>ctx.User).Returns(fakeUser);
controller.ControllerContext=新的ControllerContext(context.Object,new RouteData(),controller);
}