我的任务是设置一些“集成测试”(而不是“单元测试”或“ 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请求。当您运行业力/茉莉花测试时,它将显示正在提出的所有请求。