javascript - 如何检查方法是否已被调用 Jasmine 单元测试

标签 javascript angularjs unit-testing karma-runner

我是单元测试的新手,在阅读文档后,我仍然对如何检查异步方法感到困惑,据我所知,我需要使用 running() 和 wait()。但是,我可以使用 spy On 来检查该方法是否已被调用,而不是这样做。

这是我要测试的代码

  $scope.createMedicalServices = function(){
        if($scope.newTreatment.async_selected_treatment.id == null){
            $scope.newTreatment.description = $scope.newTreatment.description_no_id;
        }
        else{
            $scope.newTreatment.description = $scope.newTreatment.description;
        }

      $scope.newTreatment.no_cpt_code = $scope.newTreatment.no_cpt_code;
      $scope.newTreatment.cash_price = $scope.newTreatment.cash_price_input;
      $scope.newTreatment.average_price = $scope.newTreatment.average_price_input;
      $scope.newTreatment.service = $scope.newTreatment.async_selected_treatment.service;

      var returnPromiseObject;
      if ($scope.newTreatment.no_cpt_code) {
            returnPromiseObject = ProviderMedicalService.createNew($scope.newTreatment);
      }
      else if($scope.newTreatment.async_selected_treatment.id == null){
            returnPromiseObject = ProviderMedicalService.createNewCPT($scope.newTreatment);
      }
      else{
        returnPromiseObject = ProviderMedicalService.createExisting($scope.newTreatment);
      }

      returnPromiseObject.then(
        function (value){
          $scope.newTreatment.id = value.id;
          $scope.provider_medical_services.push($scope.newTreatment);
        },
        function (error){
          console.log(error);
        });
        };

  $scope.searchTreatments = function(value){
    return Treatment.find(value).then(function(values){
      return values;
    });
  };

这是我到目前为止所写的,但内容并不多,因为我不知道如何测试它。

  it('search treament should have been called and return a value'),function(){
  scope.searchTreatments();

}

it('it should create medical service after submitting the form'),function(){
  scope.createMedicalServices();
  runs
}

基本上,如果该方法能够正确调用,我就很满意,因为 createMedicalService 函数实际上是在用户单击提交表单时执行的,作为 html 文件上 ng-submit 的一部分。

非常感谢帮助和建议

最佳答案

单元测试一开始可能会有点困惑。有一些有助于单元测试的原则。

目的单一。一个组件应该只做一件事。考虑将代码分成更小的部分。将逻辑从 Controller 移至工厂或服务中。这些可以单独测试。

控制反转。 Angularjs 在提供内置 IoC 方面做得很好。将依赖项作为 stub 、伪造品或模拟传递到您的单元中。

仅测试接口(interface)。测试单元的内部调用结构是一种不好的做法。这最终不是测试功能,而是测试实现。相反,想想这个例子。

您有一个 Controller ,它获取传入的名为 nameService 的休息服务。这个 Controller 有一个名为submit(first,last)的方法,当调用该方法时,应该调用nameService上的post(args)方法。

这将允许您创建 nameService 的 stub ,在 post() 方法上创建一个 spy 并将 stub 传递给我们正在测试的 Controller 。然后你可以简单地在 Controller 上调用submit()并测试它是否调用了服务。

本质上,您测试的是如果您将某些内容输入到您的单元中,您的单元将按预期输出它。

关于javascript - 如何检查方法是否已被调用 Jasmine 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251882/

相关文章:

javascript - 返回调用者数据值的 jQuery 函数

javascript - Angular JS $http post 并在 URL 中获取参数

javascript - 在 angularjs 中使用 $watch

unit-testing - 需要很多辅助方法来协助我的单元测试类——这正常吗?

unit-testing - 禁止在单元测试时弹出的对话框

javascript - deviceready 未在phonegap中触发

javascript - 当我不知道 jQuery 的更改时刻时,触发隐藏字段上的更改事件?

javascript - 如何在 Angular 指令中监听元素的属性变化?

android - 如何测试演示者 MVP Android

javascript - 自动点击在 JavaScript 中不起作用