【问题标题】:Cannot read property '0' of undefined (only on unit test)无法读取未定义的属性“0”(仅在单元测试中)
【发布时间】:2016-03-08 02:29:35
【问题描述】:

我不明白为什么会出现以下错误:

Chrome 43.0.2357 (Windows 7 0.0.0) 请求控制器测试应该 从 xhr 请求的结果中填充属性失败 TypeError:无法读取未定义的属性“0” 在 getLastStatus (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/app/tools.js:68:43) 在 C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/app/requests/requests.js:238:42 在 processQueue (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular/angular.js:14792:28) 在 C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular/angular.js:14808:27 在 Scope.$eval (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular/angular.js:16052:28) 在 Scope.$digest (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular/angular.js:15870:31) 在 Scope.$apply (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular/angular.js:16160:24) 完成(C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular/angular.js:10589:47) 在handleResponse (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular-mocks/angular-mocks.js:1194:9) 在 Function.$httpBackend.flush (C:/Users/aazor102115/Desktop/Dev/Balrog/Front/Balrog-UI/bower_components/angular-mocks/angular-mocks.js:1553:26)

此错误仅显示在业力日志上。

但它不应该因为循环条件而未定义。

在 tools.js 文件中:

function getLastStatus(statuses) {
  var lastStatusDate = Date.parse(statuses[0].date); // this is the line pointed in the error
  var lastIndex = 0;

  for (var i = 0; statuses[i]; i++) {
    var currentStatusDate = Date.parse(statuses[i].date);

    if (currentStatusDate > lastStatusDate) {
      lastStatusDate = currentStatusDate;
      lastIndex = i;
    }
  }
  return statuses[lastIndex];
}

在 requests.js 文件中:

Requests.query().$promise.then(function(result) {
      controllerScope.requestsList = [];
      for (var i = 0; result[i]; i++) {
        var currentRequest = {
          id: result[i]["id"],
          projectTitle: result[i]["project"].title,
          status: getLastStatus(result[i]["statuses"]).status, // this is the line pointed in the error
          description: result[i]["description"],
          regions: regionsIdToName(controllerScope.regionsList, result[i]["project"].regions),
          requestDate: moment(result[i]["request_date"]).format("MM-DD-YYYY"),
          developers: result[i]["developers"],
          statusDate: moment(getLastStatus(result[i]["statuses"]).date).format("MM-DD-YYYY")
        };
        controllerScope.requestsList.push(currentRequest);
      }
    });

编辑:getLastStatus(statuses) 函数的第一行添加console.log(statuses); 时:

一个对象数组显示在浏览器控制台上,就像它应该的那样。

但在 Karma 控制台上显示 undefined。所以我不明白是什么原因造成的。

【问题讨论】:

    标签: javascript angularjs unit-testing karma-jasmine


    【解决方案1】:

    result[i] 不能未定义(由于循环检查)。但似乎result[i]["statuses"] 未定义。您将 undefined 传递给 getLastStatus,然后尝试获取它的 '0' 元素。您应该检查 result[i]["statuses"] 是否未定义。

    【讨论】:

    • 每个result[i] 都有一个状态字段。此外,如果这是问题所在,错误将是 cannot read property statuses
    • @Ellone No 如果你请求一个不存在的属性,你会得到空值。
    • 我会在 getLastStatus 的开头尝试 console.log 'statuses'。也许会有所帮助。
    • @ceving 我不明白你的意思,我只是说看到错误,问题不是来自状态字段。
    • @PavelRudko 一个对象数组显示在浏览器的控制台中,就像它应该的那样。但未定义显示在业力控制台上。所以我想知道这是否不是由 Karma 引起的
    【解决方案2】:

    好的,问题来自测试文件。传递给$httpBackendrespond 方法的预期响应缺少一些属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 2017-06-16
      • 2021-12-02
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2019-09-16
      相关资源
      最近更新 更多