gpt4 book ai didi

asp.net-mvc - 在没有 UI 自动化的痛苦的情况下集成测试 MVC 应用程序

转载 作者:行者123 更新时间:2023-12-05 01:10:34 24 4
gpt4 key购买 nike

我正在开始开发一个主要使用 TDD 编写的新 MVC 应用程序。我想添加一些集成测试以确保完全连接的应用程序(我将 StructureMap 用于 IOC,NHibernate 用于持久性)按预期工作。

虽然我打算用 Selenium 编写一些功能性烟雾测试,但出于可维护性的原因,我宁愿通过使用旧的 C# 直接调用 Controller 上的操作来进行大部分集成测试。

令人惊讶的是,关于如何实现这一目标的指导很少,所以我尝试了一项攻击计划

  • 从 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>();
    }
    }

    最佳答案

    如果您想在不通过 UI 的情况下对 ASP.NET MVC 应用程序进行自动化的端到端测试,一种好的方法是以编程方式将 HTTP 请求发送到不同的 URL,然后断言系统的状态。

    您的集成测试基本上如下所示:

  • 整理:启动 Web 服务器以托管被测 Web 应用程序
  • 法案:向特定 URL 发送 HTTP 请求,该请求将由 Controller 操作处理
  • 断言:验证系统状态(例如查找特定的数据库记录),或验证响应的内容(例如在返回的 HTML 中查找特定字符串)

  • 您可以使用 CassiniDev 在进程内 Web 服务器中轻松托管 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 .

    关于asp.net-mvc - 在没有 UI 自动化的痛苦的情况下集成测试 MVC 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14817442/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com