在单元测试中获取控制器的编译模板

2024-01-09

我有以下控制器:

angular.module('app').controller('userList'
 , ['$scope','appRules',function ($scope,appRules) {
  $scope.isUserInRole=function(user,role){
    console.log("exucuting userIsInRole:",user,role);//never happens
    return  appRules.userIsInRole(user,role);
  }
  window.sscope=$scope;
  console.log($scope.menu);
}]); 

这用于以下路线:

angular.module('app', [,'ui.bootstrap','ngRoute'])
.config(['$routeProvider','$locationProvider'
,function($routeProvider,$locationProvider){
  $locationProvider.html5Mode(true);
  $locationProvider.hashPrefix('!');
  $routeProvider
          .when('/admin/users',{
            templateUrl:'app/js/partials/admin/users/list.html',
            controller:'userList'
          });
}]);

该模板将包含一些内容来检查用户是否可以看到此页面(即使有人破解了 javascript,也没关系,因为当获取或提交数据时,服务器也会进行检查)。

<div data-ng-if="!isUserInRole(login.user,'Administrator')" class="red">
  Please log in or log in as another user.
</div>
<div data-ng-if="isUserInRole(login.user,'Administrator')" class="green">
  Page to edit users.
</div>

现在我想在测试中创建一个控制器,并查看它何时渲染是否正确渲染:

  var controller,scope,element;

  beforeEach(inject(function($controller
   ,$rootScope,$compile,appRules) {
    scope=$rootScope;
    scope.login={};
    scope.isUserInRole=appRules.userIsInRole;
    controller = $controller('userList',{
      $scope:scope
    });
    //here I have the controller but how to get the html it generates
    //  when rendering the template?
    element = $compile("<div ng-controller='userList'>"
      +"<div data-ng-view=''></div></div>")(scope);
    //here element isn't rendered at all, works on directives but how
    //  to do this with controllers?
    console.log("element is:",element);
  }));

我想写一个像这样的测试

  it('Check page won\'t show if user is not set or is not Administrator.'
  , function() {
    expect($(element).text().trim()
      .indexOf("Please log in or log in as another user."))
      .toBe(0,'Show login message when login.user is not set.');
  });

但不确定如何获取元素。

[update]

我实际上正在尝试测试一个模板,因为这是由控制器使用的,我正在考虑使用控制器来测试它,但正如乔恩建议的那样,它可以作为模板加载。

我不知道如何使其编译和操作范围并再次编译。下列:

var el = angular.element(
  $templateCache
  .get('app/js/partials/admin/users/list.html'));
$rootScope = _$rootScope_;
$rootScope.menu={login:{}};
el.scope($rootScope);
$rootScope.$apply();
console.log(el.text());

这给了我两者的输出Please log in or log in as another user. and Page to edit users.看起来 element 只是未编译的原始元素。

尝试这样的事情也没有多大作用:

  beforeEach(inject(function(_$compile_
   , _$rootScope_,appSettings,$templateCache){
    console.log("before each");
    var el = angular.element($templateCache
      .get('app/js/partials/admin/users/list.html'));
    var compile=_$compile_;
    var $rootScope=_$rootScope_;
    $rootScope.login:{};
    $rootScope.isUserInRole=appSettings.userIsInRole;
    //I would think that compile would invoke the ng-if and appSettings.userIsInRole
    //  but no console log in that function is shown.
    var element = compile($templateCache
      .get('app/js/partials/admin/users/list.html'))($rootScope);
    console.log("element is:",element.html());//=undefined    
  }));

使用 ng-templates 或 ng-html2js 将模板添加到缓存,以便它们在 Karma 运行时可用。然后执行以下操作:

var 范围 = null;

beforeEach(inject(function($templateCache,_$compile_,_$rootScope_, _$controller_) {

    //get the template from the cache
    template = $templateCache.get('src/main/app/components/someController/widget-search.tpl.html');

    $compile = _$compile_;
    $rootScope = _$rootScope_;
    $controller = _$controller_;

    scope = $rootScope.new();
    //compile it
    element = $compile(template)(scope);
}));

 //then shove your compiled element into your controller instance



it( 'should be instantiated since it does not do much yet', function(){

            ctrl = $controller('SomeController',
                {
                    $scope: scope,
                    $element: element
                });

             scope.$digest();

            // my controller should set a variable called hasInstance to true when it initializes. Here i'm testing that it does.
            expect( ctrl.hasInstance).toBeTruthy();

        });

欲了解更多信息,请参阅http://angular-tips.com/blog/2014/06/introduction-to-unit-test-directives/ http://angular-tips.com/blog/2014/06/introduction-to-unit-test-directives/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在单元测试中获取控制器的编译模板 的相关文章

  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 如何计算表格上的错误数量?

    FIDDLE http jsfiddle net FeS4A 78 我如何计算表格上的错误数量 HTML div Sorry but 3 errors have been made div 您可以通过使用特定错误标准的特定计数来实现此目的的
  • 将一个文本框的内容复制到另一个文本框

    假设在文本框中输入了一个条目 是否可以在第二个文本框中保留相同的输入文本 如果是这样 这是如何完成的
  • 当您只能访问模块变量时注入模块

    假设你有一个 var app angular module Mod1 现在您需要向该模块注入其他内容 但您无法更改该行 您只能访问app多变的 所以这行不通 对吧 var mod2 angular module mod2 factory m
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • 如何改变HTML5视频的播放速度?

    如何更改 HTML5 中的视频播放速度 我查过视频标签的属性 https www w3schools com html html5 video asp在 w3school 但无法做到这一点 根据这个网站 http www chipwreck
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • 如何将测试类打包到jar中而不运行它们?

    我正在努力将我的测试类包含到 jar 包中 但不运行它们 经过一番谷歌搜索后 我尝试过mvn package DskipTests 但我的测试类根本没有添加到 jar 中 有任何想法吗 如果您遵循 Maven 约定 那么您的测试类位于src
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标

随机推荐

  • 您重构代码的方式和频率如何?

    我的问题模糊地涉及this one https stackoverflow com questions 140677 how often should you refactor 但是 它不涉及技术或实践 我在读务实的程序员并且它强烈提倡尽可
  • 将大型 JS blob 传递给 Blazor byte[]

    我需要使用录制一些音频 甚至视频媒体API https developer mozilla org en US docs Web API MediaRecorder in JS example https mbuotidem github
  • 在生产中部署 Spring Boot

    我们有一个 Spring Boot Angular 应用程序 目前我们正在将其打包为 jar 并运行它 可以将包装用作 JAR 吗 或者我们应该转向 WAR 类型的包装 会有什么不同呢 除了部署方式之外 没有其他区别 使用 JAR 时 Sp
  • GridX启动后如何重新计算列宽?

    根据文档 https github com oria gridx wiki Create the Simplest Gridx https github com oria gridx wiki Create the Simplest Gri
  • SVG animateTransform 平移和缩放同时失败

    我有一条想要使用的动画路径animateTransform 我想同时平移和缩放路径 这不起作用 显然只有第二个动画起作用 在这种情况下scale 我究竟做错了什么 svg width 300px border 1px solid fill
  • 在ubuntu Linux服务器上通过命令行运行php文件

    我试图在 ubuntu Linux 服务器上运行 php 文件 但当我运行 php file name php 时出现 找不到命令 错误 在网上搜索时 我发现一篇文章建议我运行 sudo aptitude install php5 cli
  • InterfaceBuilder NSButton 连接到 NSViewController 原因“无法连接操作,目标类 NSObject 不响应”

    我有一个基于视图的NSTableView其 文件的所有者 是ViewController 我在自定义上拖动了一个按钮 用于删除 NSTableCellView 所以我想单击按钮并从 tableView 中删除当前行 但是当添加行时调试控制台
  • 隐藏用于 editText 焦点/触摸的软键盘

    我试图隐藏软键盘 使其在 EditText 接收焦点或触摸事件时不显示 我希望 EditText 是可编辑的 EditText 中会有文本 因此我希望 EditText 响应触摸事件 以便定位光标 但我将有专用的编辑按钮 而不是使用软键盘
  • 使用 Jasmine 测试时,Angularjs 注入控制器为空

    我目前正在与Angular 以及使用 Karma 和 Jasmine进行测试 例如 过滤器被注入到主模块中 并且可以毫无问题地进行测试 但是当我尝试测试控制器时 我得到了一个空物体注射后 这是我的主模块的代码 function use st
  • 具有固定滚动行和固定滚动列的大型动态大小 html 表格

    我需要在网页上显示一个大表格 并且需要防止第一列和第一行滚动 我想动态设置此表的垂直大小 在某些静态大小的页眉 页脚页面内容之间 以使其尽可能高 而不强制浏览器窗口具有垂直滚动条 browser window fixed static we
  • SwiftUI 安排本地通知没有按钮?

    这可能有一个非常简单的答案 因为我对 Swift 和 SwiftUI 还很陌生 并且刚刚开始学习 我正在尝试安排每天在特定时间重复的本地通知 但仅在选择切换时才执行此操作 因此 如果变量为真 我希望安排该通知 我在网上看了一些教程 比如这个
  • POST 字典为 JSON

    我需要将字典中的一些字段 来自 VB Net 应用程序 以 JSON 格式发送到 Web 服务 下面是代码 Dim dict As New Dictionary Of String String dict Add Drinks 2 dict
  • Fortran 中是否可以将零值变量输出为空白?

    我想在格式化文件中输出实际变量 如果变量非零 则使用格式语句 但如果变量为零 则仅输出空格 类似于 Iw 0 的做法 是否可以在格式语句中执行此操作 谢谢 不 不是使用格式语句 但是通过将值写入字符串并进行处理 这相当容易做到 下面是一个演
  • 如何制作一个极其广泛的情节

    我有一个包含 10000 个观察值的长时间序列 我想将其可视化 问题是 如果我只是正常地绘制它 时间维度将被压缩 并且我想要可视化的时间序列的任何细节都不会明显 例如 plot sin 1 10000 100 rnorm 10000 5 t
  • 具有私有 IP 的 Kubernetes 入口控制器

    是否可以在没有公共 IP 地址的情况下部署入口控制器 nginx Thanks 是否可以在没有公共 IP 地址的情况下部署入口控制器 nginx 毫无疑问 是的 如果 Ingress 控制器的Service is of type NodeP
  • 如何显示 url 中的图像?

    我有一个字符串变量tmpImgURLStr其中包含类似的 URLwww abc com img png 我想在我的 imageView 中显示该图像 因为我使用了一些代码 但它不起作用 如下所示 NSLog Img URL tmpImgUR
  • C++:按值将对象传递给同一类的成员函数

    我是 C 的初学者 刚刚开始学习 OOP 在下面的程序中 我添加了相同类的对象并显示了结果 但是 我无法理解这样一个事实 如果我按值将对象传递给函数 那么更改如何反映在调用函数中 这addNumbers 函数需要 Complex 类的两个对
  • 如何在test-cafe中使用数据发出post请求?

    我是 api 测试的初学者 我正在使用test cafe我已经写了测试来制作GET请求使用请求钩子工作正常 我能够获取数据 但是当我尝试制作时POST请求使用相同的请求钩子并且我在发出请求时无法发送数据 因为它需要是缓冲区类型 我无法将 J
  • 在 redux-observable 中编写和排序多个史诗

    我有一个问题不知道如何解决 我有两个史诗向 api 发出请求并更新商店 const mapSuccess actionType gt response gt type actionType SUCCESS payload response
  • 在单元测试中获取控制器的编译模板

    我有以下控制器 angular module app controller userList scope appRules function scope appRules scope isUserInRole function user r