AngularJS:测试实际的$http请求(不是mock)以获得成功()或错误()案例。。。?
我的任务是设置一些“集成测试”(而不是“单元测试”或“UI测试”[aka.E2E/dragrator])。这个集成测试只是测试控制器对外部API的$http POST请求,并检查预期的响应情况 我试过这个: -无ngMock(应直接连接到http资源); -使用ngMock(由于未定义passThrough(),无法访问http资源); -最后,使用ngMockE2E进行了尝试,passThrough()应该可以工作,但请求不会返回success()或error() 我尝试了AngularJS:测试实际的$http请求(不是mock)以获得成功()或错误()案例。。。?,angularjs,unit-testing,protractor,angularjs-e2e,httpbackend,Angularjs,Unit Testing,Protractor,Angularjs E2e,Httpbackend,我的任务是设置一些“集成测试”(而不是“单元测试”或“UI测试”[aka.E2E/dragrator])。这个集成测试只是测试控制器对外部API的$http POST请求,并检查预期的响应情况 我试过这个: -无ngMock(应直接连接到http资源); -使用ngMock(由于未定义passThrough(),无法访问http资源); -最后,使用ngMockE2E进行了尝试,passThrough()应该可以工作,但请求不会返回success()或error() 我尝试了$httpBacke
$httpBackend.flush()
,它说“没有刷新请求!”(因为它使用的是passThrough(),我认为不需要flush函数)
我已经尝试了$rootScope.$apply()
,这没有任何区别
不确定如何使其按预期工作,甚至在不使用量角器的情况下,这是否可能。。。?有人对AngularJS应用程序进行“集成测试”吗?看起来标准是“单元测试”和“E2E测试”,而不是“集成测试”
我设置的“单元测试”使用模拟资源,并按预期调用success()和error()
想法/想法
[编辑:发现的问题与Jasmine异步测试有关。在Jasmine 1.X中,您需要使用run()和waitsFor(),在Jasmine 2.X中,您可以使用done()(虽然我无法让2.X正常工作,但它破坏了我所有的测试)。现在我接收到来自$http请求的回调,但调用它的总是error()。现在我不知道为什么不调用success()。有什么想法吗?找到了解决方案!我有几个问题需要解决
expect()
语句之前,必须等待回调。在Jasmine 1.5中,这意味着使用run()
和waitsFor()
。在Jasmine 2.0中,这意味着使用done()
。但是setTimeout()
和setInterval()
在其他情况下不起作用app_test.js
文件中启动。请参阅:“”部分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请求,请使用(free)之类的应用程序查看您的计算机上正在运行哪些http请求。当您运行karma/jasmine测试时,它将显示正在进行的所有请求。不包括
angular mocks.js
脚本就足够了,因为它将保留默认的$httpBackend
place@Phil当我尝试这样做时,$http请求的成功/错误永远不会被触发。测试显示成功(在jasmine中),但我有一个console.log('hello')代码>在从不触发的成功/错误中。然而,当我使用模拟的$http请求运行“单元测试”时,这些“hello”消息会立即出现。因此,出于某种原因,执行真正的请求不会触发成功/错误回调,这意味着我无法从服务器测试响应案例。您可以使用,安装非常简单,与ngMock类似。所以基本上排除ngMock并替换为ngMidwayTester。@wayne(1)我查看了ngMidwayTester,不知道如何使用它来测试我的应用程序。似乎我必须给它提供一个直接链接来打开,这似乎与我想做的事情背道而驰,我想做的是执行一段发出$http请求的特定代码,即我服务中的一个方法,然后捕获回调。(2) 我更新了我原来的问题,你知道为什么我不能得到一个成功的结果吗。。。?Karma或Jasmine不能打外部电话吗?你没有展示你的服务是如何实现的,所以我不知道写什么来制作ngMidwayTester。如果你没有读过这篇文章,那就相当不错了。您可以忘记将ngMockE2E与passthrough一起使用,因为您认为它将与我第一次使用它时的ngMock相同。ngMockE2E需要作为一个单独的模块编写,或者写入到您的实际服务实现中才能工作。希望看到您的测试