Angular Jasmine spyOn $ resource意外请求

时间:2016-03-30 12:42:19

标签: angularjs unit-testing karma-jasmine spyon

我正在测试Angular控制器,该控制器调用服务来获取json数据。我使用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

这是我创建的一个可以显示我所看到的行为的掠夺者。当http方法被调用时,为什么$ httpBackend?

我见过其他一些例子,他们创建了一个只包含空方法的模拟服务,但在这种情况下,如果你已经有一个虚假的服务,spyOn的callFake有什么意义呢伪造服务的方法中的callFake逻辑,并且不用担心从事间谍活动。

1 个答案:

答案 0 :(得分: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()
  });