我正在尝试测试我的$scope.init(id)
功能。在这个函数中,我向我的API发出请求,返回一个对象数组,所以我想用预设的响应将其存根。
这是我失败的测试:
describe('mysite', function() {
var scope, MensDetailCtrl, $httpBackend;
beforeEach(function() {
module('mysite');
});
describe('MensDetailCtrl', function() {
beforeEach(inject(function($controller, $rootScope, $injector) {
scope = $rootScope.$new();
$httpBackend = $injector.get('$httpBackend');
$httpBackend.when('GET', '/api/products/1').respond({name: 'product_name'});
MensDetailCtrl = $controller('MensDetailCtrl', {
'$scope': scope
});
}));
describe('init(id)', function() {
it('sets scope.product', function() {
scope.init(1);
console.log(scope.product.name); // HERE: prints undefined
expect(scope.product).toBeDefined();
});
});
});
});
这是我的控制者:
app.controller('MensDetailCtrl', ['$scope', '$resource', '$controller', 'Product', function($scope, $resource, $controller, Product) {
$controller('ProductsDetailCtrl', {$scope: $scope});
$scope.init = function(id)
{
console.log("zzzzz"); // this is printed
$scope.product = Product.get({productId: id}, function(data) {
console.log("here!!!"); // this is not printed
});
}
...
}]);
我的工厂:
app.factory('Product', ['$resource', function($resource) {
return $resource("/api/products/:productId", {}, {
query: {method: 'GET', isArray: true},
});
}]);
我是不是已经使用此$httpBackend.when('GET', '/api/products/1').respond({name: 'product_name'});
将其删除了?
答案 0 :(得分:2)
您需要致电$httpBackend.flush()
。这就是我们如何在测试中解决HTTP请求的异步性质。
describe('init(id)', function() {
it('sets scope.product', function() {
scope.init(1);
$httpBackend.flush();
console.log(scope.product.name); // HERE: prints undefined
expect(scope.product).toBeDefined();
});
});
另外,对于这种测试,我喜欢使用httpBackend.expectGET('/api/products/1').respond(...)
。原因是您的测试期望此HTTP请求,如果没有,则会失败。当它失败时,将在错误消息中更清楚原因。
修改强>
documentation很好地解释了何时使用"当"与"期待"方法。
拨打$httpBackend.verifyNoOutstandingExpectation()
,$httpBackend.verifyNoOutstandingRequest()
(可能在afterEach()
区块中)也是一个好主意。