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