Angular Jasmine spyOn $resource 意外请求

Angular Jasmine spyOn $resource Unexpected request

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

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

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

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

更新:

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

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

我见过其他示例,其中他们创建了一个仅包含要监视的空方法的模拟服务,但在那种情况下,如果您已经拥有一个虚假服务,那么 spyOn 的 callFake 有什么意义,只需将 callFake虚假服务方法中的逻辑,不要为间谍而烦恼。

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

$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()
  });