18

我们刚刚开始使用 AngularJS 开发一个 Web 应用程序,并且在正确测试它时遇到了一些问题,因此我们可以使用一些建议。

一般有以下几个组件需要测试:

  1. 网络 API
  2. 角度控制器
  3. 角度路由
  4. HTML 渲染和控制器与 HTML 元素的 Angular 绑定

如何以最小的努力测试所有这些并且尽可能不重叠?

对于任何以数据库为中心的应用程序,完整的集成测试(即使用实时服务器,连接到加载数据的数据库)将特别混乱,因为必须有一个过程为所有测试生成足够的数据并重置数据库和测试必须小心不要修改彼此的数据。(如果我在这里遗漏了什么,请告诉我)

鉴于上述观点,我假设最好切断服务器和客户端之间的链接,并仅使用模拟数据运行 Angular 测试。

另外,我假设如果 E2E 测试考虑到所有可能的场景,单元测试控制器是多余的,因为它们的值绑定到模型(因此将测试上面的所有 2、3 和 4)。单元测试仅对非常复杂的控制器或测试服务和指令有用。

但是,我们找不到任何关于如何$httpBackend在每个测试的基础上模拟东西的信息,就像你在单元测试中所做的那样,使用expect*(). Angular 文档似乎建议在必要时when*()偶尔使用 plus 。passthrough()

但是,这带来了为所有场景创建测试数据的上述问题,并且您可能需要在每次测试之前重置内存数据库以确保测试不受影响。此外,您正在失去使用$httpBackEnd.expect*()which 检查没有丢失或冗余调用服务器的安全性 - 这向我表明它还需要单元测试控制器来检查这一点。

有人可以为 AngularJS 应用程序提供详细的测试策略来解决上述 4 个组件的测试以及上面写的问题吗?

4

2 回答 2

9
  1. 不确定 - 由于您的 Angular 应用程序在理论上与您的后端分离,因此没有特别的理由需要将 Angular 测试和后端测试混合在一起。我会单独测试它们,每个测试套件都假设其他组件工作正常。(因此,在测试 Angular 时,您假设服务器将按预期工作。)

  2. 单元测试——它们比 E2E 测试提供更多的深度。更容易验证代码将面临的特定条件。根据需要模拟所有依赖项并仅测试单元测试感兴趣的组件也很容易。单元测试不关心 UI 的工作方式,也不关心正确的数据是否正确绑定,而不是业务逻辑该应用程序是正确的。

  3. (和 4)E2E 测试 - 粒度较小,专注于确保 UI 从最终用户的角度来看符合预期。您说得对,针对实时数据库进行测试很麻烦(尽管有些人喜欢完整的端到端集成测试提供的安全性),因此您应该使用$httpBackend来模拟服务器。

于 2012-11-09T17:55:59.797 回答
0

请参阅此https://www.sitepoint.com/unit-and-e2e-testing-in-angularjs/。如果您的服务/工厂使用 http 服务调用远程 API,您可以从中返回虚假数据以进行单元测试。如果您正在开始一个新的 Angular 项目,请考虑使用 Protractor 进行 E2E 测试。

于 2016-09-01T11:16:18.663 回答