Tôi đang cố gắng thêm thử nghiệm đơn vị vào một ứng dụng ASP.NET MVC mà tôi đã xây dựng. Trong các bài kiểm tra đơn vị của tôi, tôi sử dụng mã sau đây:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Với các trợ giúp sau để mô phỏng bối cảnh của bộ điều khiển:
public static class FakeControllerContext {
public static HttpContextBase FakeHttpContext(string username) {
var context = new Mock<HttpContextBase>();
context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));
if (!string.IsNullOrEmpty(username))
context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, string username = null) {
var httpContext = FakeHttpContext(username);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}
}
Lớp kiểm tra này kế thừa từ một lớp cơ sở có các mục sau:
[TestInitialize]
public void Init() {
...
}
Trong phương thức này, nó gọi một thư viện (mà tôi không có quyền kiểm soát) cố gắng chạy đoạn mã sau:
HttpContext.Current.User.Identity.IsAuthenticated
Bây giờ bạn có thể thấy vấn đề. Tôi đã thiết lập HTTPContext chống lại bộ điều khiển nhưng không phải trong phương thức init cơ sở này. Kiểm tra đơn vị / chế nhạo là rất mới đối với tôi vì vậy tôi muốn chắc chắn rằng tôi làm đúng. Cách chính xác để tôi giả định HTTPContext là gì để nó được chia sẻ trên bộ điều khiển của tôi và bất kỳ thư viện nào được gọi trong phương thức init của tôi.