茉莉角单位测试'无法读取'属性'未定义的

时间:2016-06-25 08:58:46

标签: javascript angularjs unit-testing karma-jasmine karma-mocha

我刚开始学习角度单位测试。但是,对具有http调用的函数的此测试失败。我有针对这个问题,但是我无法修复它。我知道这是一个简单的问题

控制器

//Get data from URL
vm.getJson = function() {
    var url = 'https://www.reddit.com/r/worldnews/new.json',
        count = 0;
    $http.get(url).success(function(response) {
        console.log(response);
        for (var i = 0; i < response.data.children.length; i++) {
            vm.data.push(response.data.children[i].data);
            count++;
            if (count === response.data.children.length) {
                vm.numberOfPages();
            }
        }

        vm.result = true;

    }).error(function(err) {
        console.log(err);
    });

};

我得到的回应是: enter image description here

规格

 //Testing the getJson function
describe('vm.getJson()', function() {

   it('It should return dummy Data as response and vm.result to be truthy', function() {

    var dummyData = {name: 'Umair'};
    $httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData);

    MainCtrl.getJson(); 

    $httpBackend.flush();

    expect(MainCtrl.result).toBeTruthy();


}); });

如果我从控制器功能中删除了循环,我不会收到任何错误并且测试通过。我得到的错误是:

无法阅读&#39;儿童&#39;未定义。从我附有响应数据的图像中,children是数组。

4 个答案:

答案 0 :(得分:2)

当您的测试运行时,$ httpBackend实际上拦截了$http.get来电并将dummyData分配给您在

中指示的回复
$httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData);

这种模拟行为允许您快速完成单元测试,而不依赖于从测试计算机可以访问的reddit。因此,在您的控制器中,response.data = {name: 'Umair'}并且该对象没有名为children的子项。

要解决这个问题,对于dummyData,请尝试更多地模仿真实数据。

答案 1 :(得分:1)

您在测试中返回了一个包含属性name的对象,然后您尝试访问未定义的属性data

您应该在测试中模拟真实的响应对象,例如:

var dummyData = {
  data: {
    children: [ 
    { data: 'foo'}
    ]
  }
};

答案 2 :(得分:0)

你的dummyData不是一个数组,我想这可以解决这个问题,请尝试使用下面的测试

//Testing the getJson function
describe('vm.getJson()', function() {

    it('It should return dummy Data as response and vm.result to be truthy', function() {

        var dummyData = [{ data: 'Umair' }];
        $httpBackend
            .when('GET', 'https://www.reddit.com/r/worldnews/new.json')
            .respond(.respond(
                function() {
                    return [200, dummyData, {}];
                }););

        MainCtrl.getJson();

        $httpBackend.flush();

        expect(MainCtrl.result).toBeTruthy();

    });
});

答案 3 :(得分:0)

您应该在组件范围内定义未定义的变量:

.key