【问题标题】:How to test an angular $scope function?如何测试角度 $scope 函数?
【发布时间】:2014-07-11 16:21:02
【问题描述】:

我正在尝试对我的角度控制进行测试。如何测试函数中的变量?

示例:

$scope.onFileSelect = function($files) {
$scope.selectedFiles = [];
$scope.progress = [];

if ($scope.upload && $scope.upload.length > 0) {
  for (var i = 0; i < $scope.upload.length; i++) {
    if ($scope.upload[i] !== null) {
      $scope.upload[i].abort();
    }
  }
}
$scope.upload = [];
$scope.uploadResult = [];
$scope.selectedFiles = $files;
$scope.dataUrls = [];



    if ($scope.selectedFiles.length==1) {
      for ( var i = 0; i < $files.length; i++) {
        var $file = $files[i];
        if (window.FileReader && $file.type.indexOf('image') > -1) {
          var fileReader = new FileReader();
          fileReader.readAsDataURL($files[i]);
          var loadFile = function(fileReader, index) {
            fileReader.onload = function(e) {
              $timeout(function() {
                $scope.dataUrls[index] = e.target.result;
              });
            };
          }(fileReader, i);
        }
        $scope.progress[i] = -1;
        if ($scope.uploadRightAway) {
          $scope.start(i);
        }
      }

    }
    else{
      $scope.selectedFiles = null;
      $scope.clientmsg={};
      $scope.errormessageheader="";
      $scope.uploadErrors="";
      $scope.UploadSuccess="";
      auxArray = [""];
      $scope.uploadErrors =auxArray;
      $scope.errormessageheader="Only_submit_one_file";
    }
  };

还有我的测试...

describe('Unit: routeAssignUpload_Ctrl', function () {

beforeEach(angular.mock.module('primaryDistributionApp'));

var ctrl, scope;
// inject the $controller and $rootScope services
// in the beforeEach block
beforeEach(inject(function($controller, $rootScope) {
// Create a new scope that's a child of the $rootScope
scope = $rootScope.$new();
// Create the controller
ctrl = $controller('routeAssignUpload_Ctrl', {
  $scope: scope
});
}));



it('probando funcion onFileSelect',function(){
expect(scope.onFileSelect).toBeDefined();
var onFileSelect1 = new scope.onFileSelect;
spyOn(onFileSelect1).andCallThrough();
expect(scope.upload).toBeDefined();
});


})

结果是“TypeError: 'undefined' is not an object”(评估 '$scope.selectedFile s.长度') 我不明白为什么,谁能帮帮我?

【问题讨论】:

    标签: javascript angularjs unit-testing testing


    【解决方案1】:

    需要考虑的一些事项。

    1. 为什么在尝试调用scope.onFileSelect 时使用new 关键字?这只是一个作用域方法,您不需要(也可能不想)将其用作构造方法。
    2. 您没有将任何变量传递给scope.onFileSelect。这意味着$files 变量是undefined。然后通过$scope.selectedFiles = $files; 分配它并测试它的长度(if ($scope.selectedFiles.length==1) { ... })。如错误所示,undefined 没有 length 属性。

    我也看不出有什么理由需要监视onFileSelect——你正在测试它的行为,并且你正在直接调用它;当您想测试其他一些函数是否为您调用此函数时,使用spyOn(..).andCallThrough 最有用,而不会中断其行为。您的测试可能会更好地编写如下(充实以测试更有趣的行为):

    it('probando funcion onFileSelect',function(){
        var files = ['fileA', 'fileB'];
        expect(scope.onFileSelect).toBeDefined();
        scope.onFileSelect(files);
        expect(scope.selectedFiles).toBe(files);
        expect(scope.upload).toBeDefined(); // or whatever
    });
    

    您应该问自己的问题是您真正想要测试的行为是什么。目前,这不是一个非常有趣的测试——你知道upload 已定义,但你还不知道它有什么有趣的地方。

    【讨论】:

    • 谢谢,我真的是 JS 和 noobin 角度和测试的菜鸟,这是我的第一个规范,我不知道如何进行良好的单元测试,我不知道什么行为测试,如果可以的话指导我,我将不胜感激。我运行你的答案,结果是 "Expected null to be [ 'fileA', 'fileB' ]" ,这意味着 scope.selectedFiles 可能为空?为什么?
    • 那是因为我没有仔细阅读您的原始代码。它是由以下原因引起的:if ($scope.selectedFiles.length==1) { ... } else{ $scope.selectedFiles = null; ... } 所以,它是空的,因为我的示例使用长度为 2 而不是长度为 1 的数组。我可以看到如果提交了多个文件,您会添加一条错误消息,这让我想知道为什么您期望 $files 的数组而不是单个字符串参数 filename 或类似的。正如您所期望的那样,您拥有的代码将有效地将您限制为 1,但这似乎不是最干净的路线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2022-01-10
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多