gpt4 book ai didi

javascript - 使用 $httpBackend 进行 AngularJS 测试 - 服务未被调用

转载 作者:行者123 更新时间:2023-11-28 21:31:16 40 4
gpt4 key购买 nike

我正在尝试测试非常简单的 AngularJS 服务加载 JSON 数据:

angular.module('archive', [])  .factory('Loader', function ($http) {    var result;    $http.get('path').success(function(data) {      result = data;      console.log('returning: ', result);    });    return {      getData: result    }  });

这是我的测试:

describe('TestArchive', function () {  beforeEach(module('archive'));  it('should load data', inject(function(Loader, $httpBackend){    $httpBackend      .whenGET('path')      .respond(22);    var result = Loader.getData;    $httpBackend.flush();    console.log(result);  }));});

我期待看到 22 加载,但正如我从 console 看到的那样,它没有发生并且 resultundefined。知道哪里出了问题吗?

最佳答案

在服务定义中,您基本上是在说:

var result;
$http.get().success(function(data) {
result = data; // will be executed after below 'return'
}
return result;

这意味着返回时结果将是未定义的,因为异步 http 调用。

更好的方法是返回一个返回实际结果的函数:

return {
getData: function() { return result; }
};

但请注意,即使采用这种方法,您也可能过早调用 getData()(在 http 请求有机会完成之前)。

最后,防止失败的方法是只返回一个手动创建的 promise (如@dimirc 所建议的),或者只是返回 $http.get() 本身返回的 promise :

return {
getData: $http.get('path')
};

此外,请注意 respond() 喜欢将响应数据作为字符串,因为它也可以接受 http 状态(数字)作为第一个参数:

$httpBackend.whenGET('path').respond(200, '22');

它可能会使用数字作为单个参数,但最好清楚地说明您的意图:)

关于javascript - 使用 $httpBackend 进行 AngularJS 测试 - 服务未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517235/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com