我正在为angularjs编写单元测试,这里有一个错误,我无法弄清楚。
这是控制器:
controller('MetricController', function($scope, $interval, $http, $filter, $routeParams, ServiceEnum, DateTimeFormatter, RefreshInterval) {
$scope.categories = {};
$scope.dataset = {};
$scope.attrs = {};
$scope.loadData = function() {
$http.get(ServiceEnum.Metrics).then(function processResponse(result) {
$scope.metricsUnsortedData = result.data;
$scope.metricsData = $filter('orderBy')($scope.metricsUnsortedData, 'instanceName');
})
.catch(function processError(error) {
$scope.metricsUnsortedData = error;
});
};
$scope.loadData();
});
这是我的单元测试。我想测试它可以成功返回数据:
it('should get data successfully', function() {
$httpBackend
.when('GET', 'http://localhost/foo')
.respond(200, { foo: 'bar' });
$httpBackend.flush();
expect(scope.metricsUnsortedData).toEqual({ foo: 'bar' });
});
错误是:
预期错误:[orderBy:notarray]预期数组但收到:{" foo":" bar"}
http://errors.angularjs.org/1.6.4/orderBy/notarray?p0=%7B%22foo%22%3A%22bar%22%7D等于{foo:' bar' }。
错误:预期错误:[orderBy:notarray]预期数组但收到:{" foo":" bar"}
http://errors.angularjs.org/1.6.4/orderBy/notarray?p0=%7B%22foo%22%3A%22bar%22%7D等于{foo:' bar' }。
在对象。 (组件/度量/ metricsTest.js:97:47)
我不知道为什么会这样。之前的单元测试可以通过,这个我只在控制器中添加$ filter,但是失败了。希望有人能给我一些建议。
由于
答案 0 :(得分:0)
$filter('orderBy')
函数必须对数组进行操作,而不是对象或任何其他类型。通过模拟$httpBackend
返回{ foo: 'bar' }
(一个对象)作为请求的数据,result.data
因此$scope.metricsUnsortedData
最终成为{ foo: 'bar' }
对象。
相反,让模拟后端成为一个空数组或类似的。
it('should get data successfully', function() {
$httpBackend
.when('GET', 'http://localhost/foo')
.respond(200, []);
$httpBackend.flush();
expect(scope.metricsUnsortedData).toEqual([]);
});