【问题标题】:asp.net mvc integration testasp.net mvc 集成测试
【发布时间】:2010-07-08 15:19:18
【问题描述】:

您好,我正在为一个 asp.net mvc 项目做 TDD,我需要能够进行端到端测试,以便将请求发送到控制器操作一直到存储库。我曾尝试使用the code here,但不幸的是我无法运行它,而且我的时间不多了,有没有人知道在测试场景中伪造 http 请求和填充请求发布参数的任何其他方法?

我的控制器动作如下:

[HttpPost]
public ActionResult CreateUser(User user)
{
}

所以我基本上需要做一个 http 请求来填充这个用户对象,并希望将它保存到一个测试存储库。

【问题讨论】:

  • 大家好,我设法让 Steve Sanderson 的集成测试框架启动并运行。我不得不修改源代码,因为我的项目中的一些 dll 存在问题,即 Nhibernate dll 并不断抛出异常,但它现在很好,并且是集成测试的绝佳工具

标签: asp.net asp.net-mvc unit-testing tdd


【解决方案1】:

当您发布链接时,我将从史蒂夫·桑德森的博客中摘录:

集成测试测试您的整个软件堆栈是否协同工作。这些测试不会模拟或伪造任何东西(它们使用真实的数据库和真实的网络连接),并且擅长发现您的单元测试组件是否按预期协同工作。一般来说,最好将大部分精力用于构建一套可靠的单元测试,然后为每个主要功能添加一些集成测试,这样您就可以在客户之前检测到任何灾难性的不兼容或配置错误。

您不应该在这个阶段伪造 HTTP 请求,因为集成测试天生就会一起测试每个组件。

尝试某种类型的浏览器自动化框架:

【讨论】:

    【解决方案2】:

    如果您想进行完整的集成测试,请从用户角度测试您的应用程序。创建测试用例,例如:

    1. 以管理员身份登录
    2. 转到用户页面
    3. 添加名为“User1”的用户
    4. 检查用户网格中列出的名为“User1”的用户。

    并使用 Selenium 或 Watin 自动执行此类测试。见例子here

    【讨论】:

      【解决方案3】:

      您可能还想看看 Verde 框架。从语义上讲,这些测试看起来类似于 Steve Sanderson 的 MvcIntegrationTestFramework,主要区别在于 Verde 在您的实际 IIS AppDomain(通过基于浏览器的测试运行程序)的上下文中执行测试,而不是通过编程创建的。这提供了几个优点:首先,它可以更真实地模拟您的实际应用程序的配置、网络拓扑、安全设置等。其次,您可以在部署后的步骤中自动运行测试,或者甚至可以自动运行测试:生产中应用程序监控的一部分。以下是从 MvcMusicStore 示例中提取的 Verde 测试示例,该示例包含在 GitHub 上的源代码中:

      [IntegrationTest]
      public void Index_Load_ExpectedHtml()
      {
        // Get a product to load the details page for.
        var album = storeDB.Albums
          .Take(1)
          .First();
      
        using (var scope = new MvcExecutorScope("Store/Details/" + album.AlbumId))
        {
          Assert.AreEqual(200, scope.HttpContext.Response.StatusCode);
          Assert.IsTrue(scope.Controller is StoreController);
          Assert.AreEqual("Details", scope.Action);
      
          var model = scope.Controller.ViewData.Model as Album;
          Assert.IsNotNull(model);
          Assert.AreEqual(album.AlbumId, model.AlbumId);
      
          Assert.IsFalse(String.IsNullOrEmpty(scope.ResponseText));
      
          // Load the ResponseText into an HtmlDocument
          var html = new HtmlDocument();
          html.LoadHtml(scope.ResponseText);
      
          // Use ScrappySharp CSS selector to make assertions about the rendered HTML
          Assert.AreEqual(album.Title, html.DocumentNode.CssSelect("#main h2").First().InnerText);
        }
      }
      

      有一个 NuGet 包可以很容易地添加到您的 MVC 项目中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多