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

测试AngularUI Bootstrap模式实例控制器

牛迪
2023-03-14
问题内容

引用的SO是一个非常有用的问题,答案非常有用。但是,这之后我剩下的问题是:如何对模态实例控制器进行单元测试?在引用的SO中,测试了调用控制器,但模拟了模态实例控制器。可以说后者也应该进行测试,但是事实证明这非常棘手。原因如下:

我将在此处从引用的SO复制相同的示例:

.controller('ModalInstanceCtrl', function($scope, $modalInstance, items){
  $scope.items = items;
  $scope.selected = {
    item: $scope.items[0]
  };

  $scope.ok = function () {
    $modalInstance.close($scope.selected.item);
  };

  $scope.cancel = function () {
    $modalInstance.dismiss('cancel');
  };
});

因此,我首先想到的是,我将直接在测试中实例化该控制器,就像在测试中的其他任何控制器一样:

beforeEach(inject(function($rootScope) {
  scope = $rootScope.$new();
  ctrl = $controller('ModalInstanceCtrl', {$scope: scope});
});

这不起作用,因为在这种情况下,angular没有提供注入$modalInstance的提供程序,因为它是由UI模态提供的。

接下来,我转向计划B:使用$ modal.open实例化控制器。这将按预期运行:

beforeEach(inject(function($rootScope, $modal) {
  scope = $rootScope.$new();
  modalInstance = $modal.open({
    template: '<html></html>',
    controller: 'ModalInstanceCtrl',
    scope: scope
  });
});

(请注意,模板不能为空字符串,否则会因密码错误而失败。)

现在的问题是,我对范围没有任何了解,这是对单元测试资源收集进行惯用的方式,等等。在我的真实代码中,控制器调用资源服务来填充选择列表。我对此进行的测试尝试设置了一个ExpectGet来满足控制器使用的服务,并且我想验证控制器是否将结果放入其范围内。但是模态正在为模态实例控制器创建一个
新的 作用域(使用我作为原型传入的作用域),我无法弄清楚如何获得该作用域的漏洞。modalInstance对象没有进入控制器的窗口。

关于“正确”的测试方法有什么建议吗?

(注意:为模态实例控制器创建派生范围的行为并非意外-这已得到记录,这是我的问题,无论如何,它的测试仍然有效。)


问题答案:

我通过直接实例化控制器来测试模式对话框中使用的控制器(与您最初在上面所做的相同)。

由于没有$modalInstance的模拟版本,我只需创建一个模拟对象并将其传递给控制器​​即可。

var modalInstance = { close: function() {}, dismiss: function() {} };
var items = []; // whatever...

beforeEach(inject(function($rootScope) {
  scope = $rootScope.$new();
  ctrl = $controller('ModalInstanceCtrl', {
      $scope: scope, 
      $modalInstance: modalInstance, 
      items: items
  });
}));

现在,控制器的依赖关系已满足,您可以像其他任何控制器一样测试该控制器。

例如,我可以这样做spyOn(modalInstance,'close'),然后断言我的控制器正在适当的时间关闭对话框。



 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/testing-controllers/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller集成自Ember.Object。 针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。 测试控制器操作 下面给出一个PostsController

  • 问题内容: 我有一个ParseService,我想对其进行模拟以测试使用它的所有控制器,我一直在阅读有关茉莉花间谍的信息,但对我来说仍然不清楚。谁能给我一个关于如何模拟定制服务并在Controller测试中使用它的示例吗? 现在,我有一个使用服务插入书的控制器: 服务是这样的: 到目前为止,我的测试如下所示: 现在测试失败: 我做错了什么? 问题答案: 我做错的是没有在beforeEach中将模拟

  • 我试图在Spring boot 2中编写一个测试类,其中: 我想测试一个控制器 我想嘲笑一个仓库 我想按原样注入一个服务(即不嘲笑它) 该类看起来像: 的(唯一)实现是用注释的,并允许通过其构造函数注入仓库: 运行测试时,我得到了一个,大致上说是“没有可用”。 我怀疑我可能需要一个特定的测试配置来获得服务,但是我被可用的在线文献弄糊涂了。 有指针吗?

  • spring-test模块对测试控制器@Controller提供了最原生的支持。详见14.6 "Spring MVC测试框架"一节。

  • 本文向大家介绍JSP使用Servlet作为控制器实现MVC模式实例详解,包括了JSP使用Servlet作为控制器实现MVC模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JSP使用Servlet作为控制器实现MVC模式的方法。分享给大家供大家参考。具体如下: 一、目标: ① 初步理解MVC模式; ② 掌握Servlet的编写; ③ 使用MVC模式完成登录功能。 二、主要内容:

  • 问题内容: 我有以下情况: controller.js controllerSpec.js 错误: 我也尝试过类似的方法,但没有成功: 我该如何解决?有什么建议? 问题答案: 有两种方法(或肯定有更多方法)。 想象一下这种服务(无论它是工厂都没关系): 使用此控制器: 一种方法是使用要使用的方法创建对象并对其进行监视: 然后,将其作为dep传递给控制器​​。无需注入服务。那可行。 另一种方法是模拟