Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用$httpBackend和$scope对Angular.js进行单元测试。$watch_Javascript_Angularjs_Unit Testing_Jasmine - Fatal编程技术网

Javascript 使用$httpBackend和$scope对Angular.js进行单元测试。$watch

Javascript 使用$httpBackend和$scope对Angular.js进行单元测试。$watch,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我正在尝试测试Angular.js控制器。实际上,我正在测试调用一个模拟后端,它返回一些虚拟数据。当我获得数据时,我调用一个服务方法,将结果作为参数传递。 现在,该服务被注入到我尝试测试的控制器中,有一个$scope.$watch方法,它查找服务中更新的值,并设置控制器作用域上的数据 $scope.$watch(function(){ return FileService.getFileData(); }, function (newValue) { self.f

我正在尝试测试Angular.js控制器。实际上,我正在测试调用一个模拟后端,它返回一些虚拟数据。当我获得数据时,我调用一个服务方法,将结果作为参数传递。 现在,该服务被注入到我尝试测试的控制器中,有一个$scope.$watch方法,它查找服务中更新的值,并设置控制器作用域上的数据

  $scope.$watch(function(){
      return FileService.getFileData();
    }, function (newValue) {
    self.fileData = newValue;
    self.displayData = [].concat(self.fileData);
  });
测试:

在我的测试中,我试图检查fileData变量是否已定义。有一个控制台日志语句,它将fileData变量输出到控制台。但是,expect语句失败,出现以下错误:

PhantomJS 1.9.8 (Linux) ERROR
        TypeError: 'null' is not an object (evaluating 'this.results_.addResult')
        at /home/saurabh/workspace/OIDE/oide/client/node_modules/karma-jasmine/lib/jasmine.js:2348
两个问题:

  • 我做错了什么
  • 这是使用模拟HTTP后端进行测试的正确方法吗

  • 这是否是“正确”的方式可能只是一个意见问题,但我的看法是:

    1.)我看不到您所有的控制器代码,但通常您不需要在测试中编写实际的http.get调用,正如您在这里所做的那样,这是控制器的工作。您的测试应该实例化控制器(或者执行您的控制器正在侦听的任何操作)来触发http调用,然后您只需根据该调用断言期望值(就像正确设置$scope变量一样)

    2.)为什么此服务调用
    FileService.getFileData()
    被包装在
    $scope.watch()
    中?如果您的答案是只想在上一次成功的http调用后触发此调用,那么您应该在第一次调用后将第二次调用包装为承诺(
    。然后
    。成功
    )。 例:


    通过单元测试可能很棘手。你应该确保在你认为有效的前提下先测试否定的情况。

    < P>它是否是“正确的”方式可能只是一个观点,但是这里是我的:

    1.)我看不到您所有的控制器代码,但通常您不需要在测试中编写实际的http.get调用,正如您在这里所做的那样,这是控制器的工作。您的测试应该实例化控制器(或者执行您的控制器正在侦听的任何操作)来触发http调用,然后您只需根据该调用断言期望值(就像正确设置$scope变量一样)

    2.)为什么此服务调用
    FileService.getFileData()
    被包装在
    $scope.watch()
    中?如果您的答案是只想在上一次成功的http调用后触发此调用,那么您应该在第一次调用后将第二次调用包装为承诺(
    。然后
    。成功
    )。 例:


    通过单元测试可能很棘手。你应该确保在你认为它是有效的之前先测试这个否定的情况。< /P>在调用FLUSEH()之后移动预期,以修复这个问题,并使StimeTimeUT不必要。我仍然想知道这个方法是否正确,或者在调用flush()后将expect移动到解决了这个问题,并使setTimeout变得不必要。我仍然想知道这个方法是否正确。谢谢你的回复。该Fileservice.getFileData()调用被包装在$scope.watch中,因为该Fileservice正在另一个控制器中使用,该控制器设置在服务中写入实际HTTP调用时正在检索的值。那么,该服务是否也应该被注入?或者我应该用我在测试中编写的HTTP调用来模拟该服务吗?是的,在测试中注入该服务。然后,您还可以删除测试中的所有模拟服务代码。您总是希望单元测试涵盖应用程序(控制器/服务/工厂)中编写的代码,而不是测试中编写的代码。感谢您的回复。该Fileservice.getFileData()调用被包装在$scope.watch中,因为该Fileservice正在另一个控制器中使用,该控制器设置在服务中写入实际HTTP调用时正在检索的值。那么,该服务是否也应该被注入?或者我应该用我在测试中编写的HTTP调用来模拟该服务吗?是的,在测试中注入该服务。然后,您还可以删除测试中的所有模拟服务代码。您总是希望单元测试涵盖应用程序(控制器/服务/工厂)中编写的代码,而不是测试中编写的代码。
    PhantomJS 1.9.8 (Linux) ERROR
            TypeError: 'null' is not an object (evaluating 'this.results_.addResult')
            at /home/saurabh/workspace/OIDE/oide/client/node_modules/karma-jasmine/lib/jasmine.js:2348
    
    function makeServiceCalls() {
      mockFileService.getCurrentDirectory()
      .success( function() {
        FileService.getFileData()
        .then(// do more stuff);
      })
      .error( function() {
      // wah-wahhhh
      }
    }