集成无UI自动化的痛苦测试的MVC应用程序(Integration testing an MVC a

2019-08-16 21:32发布

我对将使用TDD在很大程度上写了一个新的MVC应用程序开始发展。 我想补充一些集成测试,以确保完全有线应用(我用StructureMap海委会,NHibernate的持久性)按预期工作。

虽然我打算写硒几个功能烟雾测试,可维护性的原因,我宁愿做我最集成测试通过直接调用,使用好老的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>();
    }
}

Answer 1:

如果你想要做的ASP.NET MVC应用程序的自动化终端到终端的测试没有通过UI去,做一个好办法,就是编程方式发送HTTP请求到不同的URL和事后断言系统的状态。

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

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

您可以使用一个进程的Web服务器很容易地举办一个ASP.NET Web应用程序CassiniDev 。 此外,以编程方式发送HTTP请求一个方便的方法是使用微软的ASP.NET Web API客户端库 。

下面是一个例子:

[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);
    }
}

如果你正在寻找这种技术的行动更完整的例子,你可以在找到样本MVC 4 Web应用程序煤矿,在那里我演示了它在写作的背景下的自动化验收测试 。



文章来源: Integration testing an MVC application without the pain of UI automation