当前位置: 首页 > 面试题库 >

如何在AngularJs中使用私有方法编写可测试的控制器?

丌官利
2023-03-14
问题内容

好了,所以我很久以来一直在某个问题上绊脚石,我想听听社区其他成员的意见。

首先,让我们看一些抽象控制器。

function Ctrl($scope, anyService) {

   $scope.field = "field";
   $scope.whenClicked = function() {
      util();
   };

   function util() {
      anyService.doSmth();
   }

}

显然,我们在这里:

  • 控制器的常规脚手架,$scope并已注入一些服务
  • 范围附带的一些字段和功能
  • 私人方法 util()

现在,我想在单元测试(Jasmine)中介绍此类。但是,问题是我想验证单击(调用whenClicked())某项时该util()方法将被调用。我不知道该怎么做,因为在Jasmine测试中,我总是会收到错误,指出util()尚未定义模拟或未调用模拟。

注意:我不是要修复这个特定的示例,而是询问有关一般测试这种html" target="_blank">代码模式的问题。
因此,请不要告诉我“什么是确切的错误”。我在问如何做到这一点,而不是如何解决这个问题。

我一直在尝试多种解决方法:

  • 显然,我无法$scope在单元测试中使用,因为我没有将此功能附加到该对象上(它通常以消息Expected spy but got undefined或类似内容结尾)
  • 我尝试通过将这些函数附加到控制器对象Ctrl.util = util;,然后验证类似的模拟,Ctrl.util = jasmine.createSpy()但是在这种情况下Ctrl.util没有被调用,因此测试失败
  • 我尝试更改util()为附加到this对象并Ctrl.util再次嘲笑,但没有运气

好吧,我无法找到解决方法,我希望JS忍者会提供一些帮助,一个有用的小提琴将是完美的。


问题答案:

在范围上命名是污染。您要做的是将该逻辑提取到一个单独的函数中,然后将其注入您的Controller中。即

function Ctrl($scope, util) {

   $scope.field = "field";
   $scope.whenClicked = function() {
      util();
   };
}

angular.module("foo", [])
       .service("anyService", function(...){...})
       .factory("util", function(anyService) {
              return function() {
                     anyService.doSmth();
              };
       });

现在,您可以使用Ctrl 以及 “ util” 模拟单元测试。



 类似资料:
  • 有没有任何变通办法来直接测试那些方法而不公开它们?

  • 我有一个Angular 11项目,我不知道如何测试私有方法。 下面是一个代码示例: 有什么想法吗?

  • 问题内容: 我正在使用spring 3.2.0和junit 4 这是我需要测试的控制器方法 spring-servlet config is: This is my test class : 如何使用MockMvc测试此方法? 问题答案: 你可以使用以下注释来使用应用程序调度程序servlet xml。以下示例使用路径/ mysessiontest设置了一些会话属性并期望返回某个视图来命中控制器:

  • 我的任务是为其他人实现的一些组件实现测试。我尽量不修改他们的代码,但我发现这很难,因为他们把所有的方法都私有化了,而且他们在方法中发出HTTP请求并订阅它,这让我很难弄清楚最好的测试场景是什么。下面是一个例子: 总而言之: > 这种情况最好的测试场景是什么?

  • 我有以下代码 我对嘲笑不熟悉。我有以下疑问。我正在尝试测试公共方法。 我是否可以断言私有变量workDone的值? 是否可以验证超类中的方法调用? 如何在方法中模拟私有方法调用?

  • 公共方法getA()的测试按预期工作,但私有方法getB()的测试不返回模拟值“b”,而是返回与方法getB()的实际返回值相对应的“b”。必须如何调整对getB()的测试,以便返回模拟值“b”?