0

我正在对调用服务以获取 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 逻辑放在假服务的方法,不要打扰间谍活动。

4

1 回答 1

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()
  });
于 2016-03-30T13:08:56.347 回答