【问题标题】:Angular Jasmine spyOn $resource Unexpected requestAngular Jasmine spyOn $resource 意外请求
【发布时间】:2016-03-30 12:42:18
【问题描述】:

我正在对一个调用服务以获取 json 数据的 Angular 控制器进行单元测试。我正在使用 Jasmine spyOn 来监视我的服务的查询方法,如下所示:

spyOn facilitiesService, 'query'
    .and
    .callFake (success, error) ->
        deferred.promise.then success
        deferred.promise.catch error
        $promise: deferred.promise

我定义了一个在开发过程中在浏览器中运行的模拟后端,它拦截真正的 REST 调用,并使用$resource(path/to.json).query() 返回假数据。每当我启用模拟后端时,浏览器测试都可以正常工作,但是当我执行scope.$digest() 时,我的单元测试会因意外请求而失败。当我监视方法时,如何调用模拟后端?

我希望此配置与指定的模拟后端一起使用,这样我就可以在浏览器中更新应用程序之前查看文件并运行单元测试。

更新:

http://plnkr.co/edit/hVc2YNnwUDNv7IHODOMD?p=preview

这是我创建的一个 plunker,它显示了我所看到的行为。为什么 $httpBackend 的 whenGET 方法也被调用了?

我已经看到其他示例,他们创建了一个模拟服务,其中只包含要监视的空方法,但在这种情况下,如果您已经有一个假服务,那么 spyOn 的 callFake 有什么意义,只需将 callFake 逻辑放入伪造服务的方法,不要打扰间谍活动。

【问题讨论】:

    标签: angularjs unit-testing karma-jasmine spyon


    【解决方案1】:

    在您的模拟期望中,您的回应是:

    $resource('bagels.json2').query()
    

    但这又是触发 http 请求的原因。选项是在它之前再添加一个期望:

    $httpBackend.whenGET('bagels.json2').respond(function() {return []});
    

    http://plnkr.co/edit/dkwl51kdMk6dADWs10bZ?p=preview

    在下面的评论之后。这是您应该将期望放入测试用例的解决方案。

    http://plnkr.co/edit/YimHnl2KztI7GET2MNWw?p=preview

    另外,你有(导致调用 bagels.json2):

    $httpBackend.whenGET('bagels.json').respond($resource('bagels.json2').query());
    

    但你应该有:

    $httpBackend.whenGET('bagels.json').respond(function() {
      $resource('bagels.json2').query()
      });
    

    【讨论】:

    • 这将解决测试用例的问题,但是在浏览器中运行时,我永远不会得到任何正确的数据?有没有办法将第二个 .whenGET 放在只有在测试运行时才会评估的地方?
    • 你可以把它放在你的 beforeEach 语句中,它通常应该放在哪里。 plnkr.co/edit/YimHnl2KztI7GET2MNWw?p=preview
    • 该建议对我有用,但我仍然不明白为什么第一个 whenGET 甚至首先被触发。 spyOn ...和.callFake不是代替了查询方法的实现吗?如果是这样,是什么导致 whenGET 甚至被触发?
    • 另外,问题是你定义了响应错误......你没有将它包装在函数中(看看我在 beforeEach 中的例子),这就是它试图得到百吉饼的原因。 json2。所以定义,而不是调用 bagels.json 导致:)
    • 现在知道了,我没有意识到 respond() 需要一个函数,所以它立即评估 $resource 调用。
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多