我的 MVC4 解决方案包含三个项目:
- Web,一个 MVC 4 Web 应用程序
- MyAccount,一个便携式区域
- 测试,一个利用 nUnit(和 moq)的类库
Web 的 global.asax 定义了一些路由,MyAccount 也是如此(在其 PortableAreaRegistration 的实现中)。
在我的 nUnit 测试中,我需要获取整个解决方案的一组路由。我可以使用以下代码获取在 Web 中定义的路由:
if (RouteTable.Routes.Count == 0)
{
RouteRegistrationConfigurator.Configure();
MvcApplication.RegisterRoutes(RouteTable.Routes);
}
当我尝试使用它扩展它以包括便携式区域时:
if (RouteTable.Routes.Count == 0)
{
var areaRegistration = new MyAccountAreaRegistration();
var areaRegistrationContext = new AreaRegistrationContext(areaRegistration.AreaName, RouteTable.Routes);
areaRegistration.RegisterArea(areaRegistrationContext);
RouteRegistrationConfigurator.Configure();
MvcApplication.RegisterRoutes(RouteTable.Routes);
}
我收到 InvalidOperationException:“由于对象的当前状态,操作无效。” 在RegisterArea()
通话中。
将此代码放在测试本身或 TestFixtureSetUp 方法中对错误没有影响。
构造AreaRegistrationContext
函数有一个可选的第三个参数,它是一个object state
. 默认情况下,它为空。给它一个空对象(new {}
或new object {}
)并不能解决错误。我无法找到任何关于该state
对象可以或应该是什么的文档。
使用AreaRegistration.RegisterAllAreas()
调用而不是注册特定区域会导致错误消息“InvalidOperationException:在应用程序的预启动初始化阶段无法调用此方法。”
我看到这些区域注册行的示例在 MVC2 项目中可用而没有此错误。MVC4 有什么不同之处会改变我应该如何设置它吗?