AngularJS:测试实际的$http请求(不是mock)以获得成功()或错误()案例。。。?

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

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

我试过这个: -无ngMock(应直接连接到http资源); -使用ngMock(由于未定义passThrough(),无法访问http资源); -最后,使用ngMockE2E进行了尝试,passThrough()应该可以工作,但请求不会返回success()或error()

我尝试了
$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()。有什么想法吗?

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

  • Jasmine async:执行$http请求时,测试将在回调运行之前完成。因此,在允许Jasmine运行
    expect()
    语句之前,必须等待回调。在Jasmine 1.5中,这意味着使用
    run()
    waitsFor()
    。在Jasmine 2.0中,这意味着使用
    done()
    。但是
    setTimeout()
    setInterval()
    在其他情况下不起作用

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

  • 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请求,请使用(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需要作为一个单独的模块编写,或者写入到您的实际服务实现中才能工作。希望看到您的测试