2009-09-21 74 views
2

我有下面的覆盖使用FormsIdentity对象使用cookie做几件事。但是当我在单元测试中实例化一个控制器时,这个方法不会被触发。任何想法如何做到这一点?如何在尝试单元测试时触发初始化方法?

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     // Grab the user's login information from FormsAuth 
     _userState = new UserState(); 
     if (this.User.Identity != null && this.User.Identity is FormsIdentity) 
      this._userState.FromString(((FormsIdentity)this.User.Identity).Ticket.UserData); 

     // have to explicitly add this so Master can see untyped value 
     this.UserState = _userState; 
     //this.ViewData["ErrorDisplay"] = this.ErrorDisplay; 

     // custom views should also add these as properties 
    } 

回答

3

Controller.Initialize(RequestContext)调用内部ControllerBase.Execute(RequestContext),这反过来又可以通过明确的实施IController.Execute(RequestContext)被调用,所以这段代码将初始化并执行控制器:

IController controller = new TestController(); 
controller.Execute(requestContext);

我已经分析了依赖关系树对于Initialize(),我看不到任何其他方式调用这种方法,而不诉诸反思。您将需要创建RequestContext传递给Execute()为好,这是比较容易,因为它看起来像你使用起订量:

var wrapper = new HttpContextWrapper(httpContext); 
var requestContext = new RequestContext(wrapper, new RouteData()); 

This link对嘲讽的HttpContext的使用起订量有帮助的细节。

+0

谢谢,山姆。我能够触发Initialize方法,但仍然出现错误,嘲笑httpContext比我想象的要困难得多。 – Geo 2009-09-22 01:24:58

+0

HttpContext是可测试性的反基督 - 我尽量远离它,我很惊讶Initialize()也是如此弱测试。也许你可以看看使用自定义模型绑定器或属性依赖注入,而不是使用Initialize()呢? – Sam 2009-09-22 01:38:04

相关问题