angularjs单元测试[orderBy:notarray]预期的数组但收到了

时间:2017-07-24 00:20:58

标签: angularjs unit-testing filter jasmine karma-jasmine

我正在为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,但是失败了。希望有人能给我一些建议。

由于

1 个答案:

答案 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([]);
});