3

我的任务是设置一些“集成测试”(不是“单元测试”或“UI 测试”[又名。E2E/量角器])。这个集成测试只是测试控制器对外部 API 的 $http POST 请求,并检查预期的响应情况。

我试过这个: - 没有 ngMock(应该直接连接到 http 资源);- 使用 ngMock(无法访问 http 资源,因为 passThrough() 未定义);- 最后尝试使用 ngMockE2E,passThrough() 据说可以工作,但请求没有返回 success() 或 error()。

我试过$httpBackend.flush()了,它说“没有刷新请求!” (因为它使用 passThrough() 我认为不需要刷新功能)。

我试过$rootScope.$apply()了,这没有任何区别。

不知道如何让它按预期工作,这甚至可能不使用量角器......?有人甚至为 AngularJS 应用程序做“集成测试”吗?看起来标准是“单元测试”和“E2E 测试”,而不是“集成测试”。

我设置的“单元测试”使用了一个模拟资源,并按预期调用了 success() 和 error()。

想法/想法?

[编辑:]发现问题与 Jasmine 异步测试有关。在 Jasmine 1.X 中你需要使用 run() 和 waitsFor(),在 Jasmine 2.X 中你可以使用 done()(虽然我无法让 2.X 工作,它只是破坏了我所有的测试)。所以现在我收到了来自 $http 请求的回调,但它总是 error() 被调用。现在我不知道为什么不调用success()。有任何想法吗?

4

1 回答 1

2

找到了解决方案!有几个问题我必须弄清楚。

  1. Jasmine async:在执行 $http 请求时,测试将在回调运行之前完成。因此,您必须等待回调才能让 Jasmine 运行该expect()语句。在 Jasmine 1.5 中,这意味着使用run()and waitsFor()。在 Jasmine 2.0 中,这意味着使用done(). 但是setTimeout()setInterval()否则将无法正常工作。

  2. Jasmine 2.0:运行具有 require.js/AngularJS 的应用程序时,Jasmine 将并行加载所有测试。app_test.js但是在运行任何其他测试之前,您需要确保应用程序已在初始文件中引导。请参阅:“ angularAMD must be bootstrapped ”部分。

  3. SSL 问题: PhantomJS 无法打开https://链接。尝试连接到http://变体。如果可行,您就知道问题出在 SSL 上。您可以修改 PhantomJS 的 karma 配置以传递属性(即--ssl-protocol=any)以使其正常工作。或者最终尝试在另一个浏览器中进行测试(即。['Chrome', 'Firefox', 'Safari', 'IE'])。

示例karma.conf.js文件:

browsers: ['PhantomJS_SSL'],

customLaunchers: {
  'PhantomJS_SSL': {
    base: 'PhantomJS',
    flags: [
      '--ignore-ssl-errors=true', 
      '--ssl-protocol=any',
      '--web-security=false'
    ]
  }
},

要查看您的 $http 请求是否被调用,请使用Fiddler(免费)之类的应用程序来查看您的计算机上正在运行哪些 http 请求。当您运行 karma/jasmine 测试时,它将显示所有正在发出的请求。

于 2014-11-10T23:32:43.597 回答