我正在开始开发一个主要使用 TDD 编写的新 MVC 应用程序。我想添加一些集成测试以确保完全连接的应用程序(我将 StructureMap 用于 IOC,NHibernate 用于持久性)按预期工作。
虽然我打算使用 Selenium 编写一些功能性冒烟测试,但出于可维护性的原因,我宁愿通过使用良好的旧 C# 在我的控制器上直接调用操作来完成大部分集成测试。
令人惊讶的是,关于如何实现这一点的指导很少,所以我尝试了一个攻击计划
- 将所有引导代码从 Global.asax 中拉出并放入一个单独的类中
- 尝试利用 MvcContrib-TestHelper 或类似工具来创建 ASP.NET 依赖项(上下文、请求等)
我已经完成了第 1 步,但真的不知道如何进行第 2 步。任何指导将不胜感激。
public class Bootstrapper
{
public static void Bootstrap()
{
DependencyResolverInitializer.Initialize();
FilterConfig.RegisterFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new SharpModelBinder();
}
}
public class DependencyResolverInitializer
{
public static Container Initialize()
{
var container = new Container();
container.Configure(x => x.Scan(y =>
{
y.Assembly(typeof(Webmin.UI.FilterConfig).Assembly);
y.WithDefaultConventions();
y.LookForRegistries();
}));
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
return container;
}
}
public class StructureMapDependencyResolver : IDependencyResolver
{
private readonly IContainer _container;
public StructureMapDependencyResolver(IContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface) {
return _container.TryGetInstance(serviceType);
}
return _container.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.GetAllInstances(serviceType).Cast<object>();
}
}