AngularJS:如何测试实际的$http请求(而不是模拟)以获得成功(success())或错误(error())情况?

3
我被指派设置一些“集成测试”(不是“单元测试”或“UI测试”[又名E2E / Protractor])。这个集成测试仅测试控制器的$http POST请求到外部API,并检查预期的响应情况。
我试过这个: -没有ngMock(应直接连接到http资源); -使用ngMock(无法通过http资源,因为passThrough()未定义); -最后尝试了ngMockE2E,passThrough()据说有效,但请求既没有返回success()也没有error()。
我尝试了$ httpBackend.flush(),它说“没有要刷新的请求!”(因为它使用passThrough()我假设不需要flush函数)。
我尝试了$rootScope.$apply(),但没有任何区别。
不确定如何按预期工作,即使不使用Protractor也可能吗…?有人甚至为AngularJS应用程序进行“集成测试”吗?看起来标准是“单元测试”和“E2E测试”,而不是“集成测试”。
我设置的“单元测试”使用模拟资源,并调用了预期的success()和error()。
想法/建议?
[编辑:]找到问题与Jasmine异步测试有关。在Jasmine 1.X中,您需要使用run()和waitsFor(),在Jasmine 2.X中,您可以使用done()(尽管我无法使2.X工作,它只是破坏了所有我的测试)。所以现在我收到来自$http请求的回调,但总是调用error()。现在我不知道为什么不调用success()。有什么想法吗?

@Phil 当我尝试这样做时,$http请求的成功/错误事件从未触发。测试结果显示为成功(在jasmine中),但是我在success/error函数内部设置了一个 console.log('hello'); ,它从未被触发。然而,当我使用模拟的 $http 请求运行我的“单元测试”时,那些“hello”消息立即出现。因此,由于某种原因,执行真正的请求从未触发成功/错误回调,这意味着我无法测试来自服务器的响应情况。 - BuildTester1
你可以使用 https://github.com/yearofmoo/ngMidwayTester,它的设置非常容易且类似于 ngMock。因此,基本上排除 ngMock 并替换为 ngMidwayTester 即可。 - wayne
@wayne (1) 我看了一下ngMidwayTester,但我不知道如何使用它来测试我的应用程序。它似乎需要提供一个直接打开的链接,这与我想要做的执行特定代码片段有些相悖,即在我的服务中调用一个方法并捕获回调。(2) 我更新了我的原始问题,你有什么想法为什么我无法得到success()结果?Karma或Jasmine是否无法进行外部调用? - BuildTester1
您没有展示服务的实现方式,因此我不知道该编写什么来创建ngMidwayTester。如果您还没有阅读http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-karma.html,强烈建议您去看一看。您可能会误以为可以使用ngMockE2E和passthrough,就像我第一次使用时一样,但事实并非如此。对于ngMockE2E,需要编写一个单独的模块或将其编写到实际服务实现中才能起作用。 - wayne
@wayne,结果我成功地实现了集成测试,而没有使用ngMockE2EngMidwayTester。虽然我还需要解决一系列其他问题,但我现在已经成功了(请参见答案)。 - BuildTester1
显示剩余2条评论
1个回答

2

找到了解决方案!我需要解决几个问题。

  1. Jasmine异步:当进行$http请求时,测试将在回调运行之前完成。因此,在允许Jasmine运行expect()语句之前,您必须等待回调完成。在Jasmine 1.5中,这意味着使用run()waitsFor()。在Jasmine 2.0中,这意味着使用done()。但是,否则setTimeout()setInterval()将不起作用。

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

  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 测试时,它会显示所有正在进行的请求。


3
非常愿意看到你的测试。 - Lane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接