gpt4 book ai didi

AngularJS "No pending request to flush",同时使用 $resource 对 Controller 进行单元测试

转载 作者:行者123 更新时间:2023-12-02 04:55:24 24 4
gpt4 key购买 nike

我正在为 Controller 编写单元测试。该 Controller 注入(inject)了 $resource 服务:

function controller($scope, Service) {
Service.get(function(result){
// do stuff with the result, not relevant here
}
}

服务定义如下:

angular.module('so').factory('Service', ['$resource', service]);
function service($resource) {
return $resource('/url', null, {
get: { method: 'POST', params: {}, isArray: false}
});
}

我的 Jasmine 单元测试如下:

describe("Controller", function(){
var $httpBackend;

beforeEach(function() {
module('so');

inject(function( _$httpBackend_) {
$httpBackend = _$httpBackend_;
});
});
it('should have done stuff irrelevant to the question', function() {
var $injector = angular.injector('so'),
$scope = $injector.get('$rootScope'),

$httpBackend
.whenPOST('/url')
.respond ([]);

// controller needs to be defined here and not in the beforeEach as there
// are more parameters passed to it, depending on the test
var controller = $injector.get('$controller')('controller', { "$scope": $scope });

$httpBackend.flush();

// then here the actual test resolution, also irrelevant
});
});

运行测试时出现错误:

Error: No pending request to flush ! in file:///path/to/angular-mock.js (line 1453)

我在 Service.get() 的回调中添加了一个 console.log(),实际上,它没有被调用(回调之外的所有内容当然都被调用)。如果在单元测试中创建 Controller 后没有分阶段,还尝试添加范围摘要,正如我在另一个问题中看到的那样,但没有运气。

我知道我可以用其他方式模拟它,但使用 $httpBackend 似乎是测试的完美解决方案:模拟网络服务器和接收到的数据。

我正在使用 AngularJS 1.2.16(无法升级到 1.3.*,需要 IE 8 兼容性)。我首先使用 1.2.13 并更新以检查它是否可以解决问题,但没有任何运气。

最佳答案

这是一个注入(inject)问题,通过更改测试从

it('should have done stuff irrelevant to the question', function() {
var $injector = angular.injector('so'),
$scope = $injector.get('$rootScope'),

$httpBackend
.whenPOST('/url')
.respond ([]);

// controller needs to be defined here and not in the beforeEach as there
// are more parameters passed to it, depending on the test
var controller = $injector.get('$controller')('controller', { "$scope": $scope });

$httpBackend.flush();

// then here the actual test resolution, also irrelevant
});

收件人:

it('should have done stuff irrelevant to the question', inject(function(Service) {
// edited lines because they did not change

var controller = $injector.get('$controller')('controller', { "$scope": $scope, "Service": Service });

// edited lines because they did not change
}));

基本上,在测试函数中添加 inject() 并将服务“手动”传递给 Controller ​​。

我找到了这个问题,这很好,但我真的不明白为什么它不起作用。另外,我在找到解决方案后立即尝试了这个:

it('should have done stuff irrelevant to the question', inject(function() {
// edited lines because they did not change
var Service = $injector.get('Service'),

var controller = $injector.get('$controller')('controller', { "$scope": $scope, "Service": Service });

// edited lines because they did not change
}));

但这又失败了,出现同样的“没有待处理的请求”错误。我猜这是某种赛车问题,我的服务在之后创建时无法获得正确的 $httpBackend 注入(inject),但我真的不明白为什么会发生这种情况。如果有人能启发我......我将不胜感激。

关于AngularJS "No pending request to flush",同时使用 $resource 对 Controller 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23158881/

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