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

我已经试过了:
-没有ngMock(应直接连接到http资源);
-使用ngMock(由于passThrough()未定义而无法访问http资源);
-最终尝试使用ngMockE2E,passThrough()应该可以正常工作,但是请求不会返回success()或error()。

我已经尝试过$httpBackend.flush()并显示“没有刷新请求!” (因为它正在使用passThrough(),所以我认为不需要flush函数)。

我已经尝试过$rootScope.$apply(),并且没有任何区别。

不确定如何使它按预期工作,甚至可以在不使用分度器的情况下...?有人甚至对AngularJS应用程序执行“集成测试”吗?看起来标准是“单元测试”和“端到端测试”,而不是“集成测试”。

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

有想法/想法吗?

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

最佳答案

找到了解决方案!有几个必须解决的问题。


茉莉花异步:执行$ http请求时,测试将在运行回调之前完成。因此,在允许Jasmine运行expect()语句之前,您必须等待回调。在Jasmine 1.5中,这意味着使用run()waitsFor()。在Jasmine 2.0中,这意味着使用done()。但是setTimeout()setInterval()否则将无法工作。
Jasmine 2.0:运行具有require.js / AngularJS的应用程序时,Jasmine将并行加载所有测试。但是在运行任何其他测试之前,您需要确保该应用已在初始app_test.js文件中进行了引导。请参阅:“ angularAMD must be bootstrapped”部分。
SSL问题:PhantomJS无法打开https://链接。尝试连接到http://变体。如果可行,您知道问题出在SSL。您可以修改PhantomJS的业力配置,以传递属性(即--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请求。当您运行业力/茉莉花测试时,它将显示正在提出的所有请求。

09-09 23:33
查看更多