使用$ httpBackend进行E2E测试,单元测试和模拟数据之间的混淆

geo*_*osd 17 javascript integration-testing unit-testing angularjs

我们刚刚开始使用AngularJS开发一个Web应用程序,我们在测试它时遇到了一些问题,所以我们可以使用一些建议.

通常,要测试以下组件:

  1. Web API
  2. 角度控制器
  3. 角度路由
  4. HTML呈现和控制器与HTML元素的Angular绑定

如何以最小的努力测试所有这些,如果可能的话,不重叠?

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

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

此外,我假设如果E2E测试处理所有可能的情况,单元测试控制器是冗余的,因为它们的值绑定到模型(因此将测试上面的所有2,3和4).单元测试仅对非常复杂的控制器或测试服务和指令有帮助.

但是,我们找不到任何关于如何$httpBackend在每次测试中模拟内容的信息,就像在单元测试中一样,使用expect*().Angular docs似乎建议在必要时when*()偶尔加用偶数passthrough().

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

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

Nic*_*ner 8

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

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

  3. (和4)E2E测试 - 更少的粒度,专注于确保UI从最终用户的角度看起来像预期的那样.你是对的,测试一个真实的数据库是很麻烦的(虽然有些人喜欢完整的端到端集成测试提供的安全性),所以你应该使用$ httpBackend来模拟服务器.