2013-02-11 45 views
3

我开始对将使用TDD在很大程度上写了一个新的MVC应用程序开发的痛苦测试的MVC应用程序。我想添加一些集成测试,以确保完全有线的应用程序(我使用IOC的StructureMap,NHibernate的持久性)按预期工作。集成无UI自动化

虽然我打算写硒几个功能烟雾测试,可维护性的原因,我宁愿做我最集成测试通过直接调用,使用好老的C#我的控制器动作。

有一个如何做到这一点少得惊人的指导,所以我花了刺攻击

  1. 把所有启动代码出来的Global.asax,并成为一个单独的类
  2. 尝试的计划利用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>(); 
    } 
} 

回答

4

如果你想要做的自动化ASP.NET MVC应用程序的终端到终端的测试无需通过UI去,一个好办法做到这一点是编程发送HTTP请求到不同的URL并在之后声明系统的状态。

集成测试将基本上是这样的:

  1. 安排:启动Web服务器测试来承载Web应用程序
  2. 法:将HTTP请求发送到特定的URL,这将由控制器操作处理
  3. 声明:验证系统状态(例如查找特定数据库记录)或验证响应内容(例如,查看f或者在返回的HTML特定字符串)

您可以轻松地在进程 Web服务器,使用CassiniDev举办一个ASP.NET Web应用程序。此外,以编程方式发送HTTP请求的一种便捷方式是使用Microsoft ASP.NET Web API Client Libraries

下面是一个例子:

[TestFixture] 
public class When_retrieving_a_customer 
{ 
    private CassiniDevServer server; 
    private HttpClient client; 

    [SetUp]   
    public void Init() 
    { 
     // Arrange 
     server = new CassiniDevServer(); 
     server.StartServer("..\relative\path\to\webapp", 80, "/", "localhost"); 
     client = new HttpClient { BaseAddress = "http://localhost" }; 
    } 

    [TearDown] 
    public void Cleanup() 
    { 
     server.StopServer(); 
     server.Dispose(); 
    } 

    [Test] 
    public void Should_return_a_view_containing_the_specified_customer_id() 
    { 
     // Act 
     var response = client.GetAsync("customers/123").Result; 

     // Assert 
     Assert.Contains("123", response.Content.ReadAsStringAsync().Result); 
    } 
} 

如果你正在寻找这种技术的行动更完整的例子,你可以找到它在sample MVC 4 web application我的,我在那里证明它写下来的情况下automated acceptance tests