使用 Jasmine 的 exceptGET / $httpBackend 时,使用 .respond() 有什么好处?

When using Jasmine's exceptGET / $httpBackend, what's the benefit of having .respond()?

我正在使用的书叫AngularJS Up and 运行。它给出了使用 exceptGET 的示例。这是示例:

mockBackend = $httpBackend;
mockBackend.exceptGET('/api/note')
    .respond([{id:1, label: 'Mock'}]);

我的问题是,单元测试服务器调用的目的不是要进行服务器调用并验证服务器调用是否符合我们的预期吗?

使用上面的代码,它不只是进行服务器调用并强制响应等于 [{id:1, label: 'Mock'}] 吗?如果我们无法检查实际响应是什么,那么这样做有什么意义?

因为稍后在代码中,它会像这样检查响应:

mockBackend.flush();
expect(ctrl.items).toEqual([{id:1, label: 'Mock'}]);

它不会总是等于 [{id:1, label: 'Mock'}] 因为那是我们强制响应等于的吗? .respond() 和控制响应有什么好处?

如果您在单元测试中实际命中服务器上的 API 端点,它就不再是单元测试了 - 它现在涉及更多不仅仅是您的被测组件(controller/service/provider 等)——网络、Web 服务器、后端本身,可能还有数据库等——现在这变成了集成测试或 system/functional 测试。

你的单元测试将不再是孤立的,并且会依赖于比它应该更多的东西。模拟的目的是使测试隔离、独立并模仿某些所需的条件——在本例中为 HTTP 响应——然后检查被测组件将如何反应。

expect(ctrl.items).toEqual([{id:1, label: 'Mock'}]);

这个 expect 调用本身至少会检查 mock 是否已成功应用 并且 items 控制器变量包含模拟响应。

请查看更多信息:

  • Unit tests vs Functional tests
  • What is Mocking?