使用AngularJS / Jasmine的$ httpBackend - 为什么要模拟响应?

时间:2015-07-01 13:24:39

标签: angularjs unit-testing jasmine

AngularJS教程说,当使用$ httpBackend时,应该嘲笑响应。我不确定的是,当我可以使用$ http并发出请求并检索“真实”数据时,为什么我要模拟对API的请求?然后我可以对实际响应运行测试,这允许检查来自API的数据响应是否已经改变(出于何种原因)。但是,如果我在模拟响应并且API数据发生了变化,那么我的模拟响应将与实际响应不同。因此,使测试不正确。

2 个答案:

答案 0 :(得分:2)

你做对了。有(至少)三种类型的测试:

  
      
  1. 单元测试
  2.   
  3. 集成测试
  4.   
  5. 系统测试
  6.   

你可以找到一个很好的解释here

每个人都定义了不同的测试。我的观点是:

  
      
  1. 单元测试分别测试模块/每个功能。
  2.   
  3. 集成测试正在测试整个工作流程(“填写注册表单>向后端发送数据>接收令牌>   登录“)
  4.   
  5. 系统测试 - 对我来说 - 是:前端的用例。示例:用户可以登录并在输入凭据后显示用户配置文件。
  6.   

您所描述的是单元测试。因此,测试您的函数是否正在执行API调用就足够了。还要测试您是否呼叫某个URL并发送正确的数据。

请记住:您经常会在代码中的每次更改时运行测试。 因此,总是调用真正的API会非常多。

From the Angular docs:

  

在单元测试期间,我们希望我们的单元测试能够快速运行而且没有   外部依赖项,因此我们不希望发送XHR或JSONP请求   到真正的服务器。我们真正需要的是验证是否确定   请求已发送或未发送,或者只是让   应用程序提出请求,使用预先训练的响应进行响应   断言最终结果是我们所期望的。

您可以使用$httpBackend.expect进行测试。

那么,如果您的API端点正在改变数据结构呢?

  1. 确保您正在测试后端,并确保按照定义发送数据
  2. 编写集成测试,检查通过特定进程的数据流(登录,接收仪表板的数据等)。
  3. 最后,没有防弹概念。但这些步骤和心态已经成为一个相当大的项目的一个很好的证据。

答案 1 :(得分:0)

Jasmine 单元测试框架。

如果您直接使用$http,则不会测试唯一的组件,您将同时测试您的API。如果您的API关闭,您的测试将失败。

单独测试您的组件更清晰。

更多:

  • $httpbackend允许您尝试API未提供的测试用例。因此,您可以构建强大的应用程序。

  • $http可能需要一段时间才能解决,$httpbackend可以通过询问来解决所有请求:

    httpBackend.flush();