HttpContext 是「萬能神器」:Request、Response、Session、Cache、User、Application……集萬千寵愛於一身,導致:
System.Web.Abstractions.dll 提供 HttpContextBase 抽象基類,ASP.NET MVC 全面依賴它而非具體實現。
public ActionResult Delete(string userName) {
this.MiddleTier.UserManager.Delete(userName);
Uri urlReferrer = this.Request.UrlReferrer; // 直接用 Request
return this.Redirect(urlReferrer.ToString());
}
// 自定義 Model Binder
public class ReferrerModelBinder : IModelBinder {
public object BindModel(ControllerContext ctx, ModelBindingContext bindingContext) {
return ctx.HttpContext.Request.UrlReferrer?.ToString();
}
}
// Controller 純粹處理業務
public ActionResult Delete(string userName, [ModelBinder(typeof(ReferrerModelBinder))] string returnUrl) {
_userService.Delete(userName);
return Redirect(returnUrl ?? "/");
}
這樣單元測試只需構造純對象圖,無需任何 Mock 框架即可驗證業務邏輯。