【问题标题】:how to check if methods have been called jasmine unit test如何检查方法是否被称为茉莉单元测试
【发布时间】:2014-08-11 20:30:50
【问题描述】:

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

这是我要测试的代码

  $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 的一部分。

非常感谢您的帮助和建议

【问题讨论】:

    标签: javascript angularjs unit-testing karma-runner


    【解决方案1】:

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

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

    控制反转。 Angularjs 在提供内置 IoC 方面做得很好。将你的依赖项作为存根、假货或模拟传递到你的单元中。

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

    你有一个控制器,它获取一个名为 nameService 的 rest 服务。这个控制器有一个名为 submit(first, last) 的方法,当被调用时,应该调用 nameService 上的方法 post(args)。

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 2017-09-27
      • 2021-09-16
      • 1970-01-01
      • 2015-12-13
      • 2022-01-23
      • 2020-11-25
      相关资源
      最近更新 更多