ฉันกำลังพยายามเพิ่มการทดสอบหน่วยในแอปพลิเคชัน ASP.NET MVC ที่ฉันสร้างขึ้น ในการทดสอบหน่วยของฉันฉันใช้รหัสต่อไปนี้:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
ด้วยผู้ช่วยดังต่อไปนี้ในการจำลองบริบทของตัวควบคุม:
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;
}
}
คลาสทดสอบนี้สืบทอดมาจากคลาสฐานซึ่งมีดังต่อไปนี้:
[TestInitialize]
public void Init() {
...
}
ภายในเมธอดนี้จะเรียกใช้ไลบรารี (ซึ่งฉันไม่สามารถควบคุมได้) ซึ่งพยายามเรียกใช้โค้ดต่อไปนี้:
HttpContext.Current.User.Identity.IsAuthenticated
ตอนนี้คุณอาจเห็นปัญหา ฉันได้ตั้งค่า HttpContext ปลอมกับตัวควบคุม แต่ไม่ได้อยู่ในเมธอด Init พื้นฐานนี้ การทดสอบหน่วย / การเยาะเย้ยเป็นสิ่งใหม่สำหรับฉันดังนั้นฉันจึงต้องการให้แน่ใจว่าฉันได้รับสิ่งนี้ถูกต้อง เป็นวิธีที่ถูกต้องสำหรับฉันที่จะเยาะเย้ย HttpContext เพื่อที่จะใช้ร่วมกันทั่วตัวควบคุมของฉันและห้องสมุดใด ๆ ที่เรียกว่าในวิธีการเริ่มต้นของฉัน