如何测试 angularjs 指令来监视函数调用?

2023-12-31

下面的代码执行但抱怨 element.popover 没有被调用。我似乎无法弄清楚问题是什么。

提前感谢您的帮助。

指示:

angular.module('directives', []).

directive('popOver', function ($http) {

    return {
        restrict:'C',

        link: function (scope, element, attr) {
            element.bind('mouseover', function (e) {
                $http.get("someurl" + attr.chatid + ".json").success(function (data) {
                    element.popover({content: data.firstName + " " + data.lastName });
                });
            });
        }
    }
})

茉莉花测试:

'user strict'

describe('directives', function() {
    beforeEach(module('directives'));
    describe('popOver', function() {
    var $scope, compile, location,  $httpBackend, elm;

    beforeEach(inject(function($rootScope, $compile, _$httpBackend_) {
        $scope = $rootScope.$new();
        compile = $compile;
        $httpBackend = _$httpBackend_;
        elm = angular.element('<i class="pop-over" data-placement="top" data-chatid="testChatId" > </i>');
        compile(elm)($scope);

    }));

    it('should call element.popover()', function() {
        $httpBackend.expectGET('someurl/testChatId.json').
            respond([ {firstName: 'test', lastName: 'user'}]);

        spyOn(elm, 'popover').andCallThrough();

        elm.trigger('mouseover');
        $httpBackend.flush();

        expect(elm.popover).toHaveBeenCalled();
    });
  });
});

Output:

Chrome 26.0 (Mac) directives popOver should call element.popover() FAILED
Expected spy popover to have been called.
Error: Expected spy popover to have been called.

Update:

我无法解决你的具体问题。主要是因为我无法让角种子运行/它花了很长时间,但我想我会让我的答案更完整。

一般有2种方法可以解决这个问题:

  1. 监视某个函数而不是由某些函数触发的函数 事件/中介
  2. 在创建对象之前监视函数的原型。换句话说:spyOn(MyObjectNamespace.Class.prototype, 'functionToSpyOn')

然后恢复一下就可以了。


我对 Angular 只是模糊地熟悉,但也遇到过类似的问题。

解决方案1

您可以将函数分开,而不是匿名指定它。这有助于专门测试您的功能并避免所有有角度的东西。

解决方案2

有时对于框架来说这是不可能的。这里的主要问题是你的间谍附加得太晚并且引用丢失或被覆盖。

Test:

describe('directives', function() {
    beforeEach(module('directives'));
    describe('popOver', function() {
    var $scope, compile, location,  $httpBackend, elm;

    beforeEach(inject(function($rootScope, $compile, _$httpBackend_) {
        $scope = $rootScope.$new();
        compile = $compile;
        $httpBackend = _$httpBackend_;
        elm = angular.element('<i class="pop-over" data-placement="top" data-chatid="testChatId" > </i>');
        compile(elm)($scope);

    }));

    it('should call element.popover()', function() {
        var popoverFunction = $.fn.popover;
        $httpBackend.expectGET('someurl/testChatId.json').
            respond([ {firstName: 'test', lastName: 'user'}]);

        spyOn($.fn, 'popover').andCallThrough();

        elm.trigger('mouseover');
        $httpBackend.flush();

        expect($.fn.popover).toHaveBeenCalled();
        //restore popover, use sinon's restore fn instead here
        $.fn.popover = popoverFunction
    });
  });
});

可以将诗乃与茉莉一起使用。 Sinon有一个spy.restore函数,可以为你删除第一行和最后一行。在我自己的测试中,我将第一行和间谍创建放在 beforeEach 中,并将恢复放在 afterEach 中。

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

如何测试 angularjs 指令来监视函数调用? 的相关文章

  • Document.createElement("br") 不适用于多次调用appendChild

    HTML var x document createElement p var br1 document createElement br var br2 document createElement br var t5 document
  • 如何处理 MSTest 中的 currentDomain.UnhandledException

    我尝试根据答案实施解决方案单元测试时如何处理其他线程引发的异常 https stackoverflow com a 934604 518530 但我仍然不明白在处理程序中要做什么 假设我有一个测试 TestMethod void Test
  • 如何从客户端设置 HTMLEditorExtender HTML

    我无法让它工作 这是我在另一个线程中找到的代码 但它对我不起作用 我得到 set content 不是函数 find set content whatever 这仍然有效吗 我还尝试设置它扩展的文本框的值 尝试设置两者的 InnerHtml
  • 如果重复,则从数组中删除两个值 - JavaScript/jQuery

    我这里有一个数组 var myArr 1 1 2 5 5 7 8 9 9 现在我想删除重复的两个外观 所以想要的结果是not var myArr 1 2 5 7 8 9 but var myArr 2 7 8 基本上我知道如何删除重复项 但
  • HTML5 URL 模式下 AngularJS 的 Flask 路由

    我有一个通过 Flask 提供服务的 AngularJS 应用程序 我使用的是 HTML5 路由模式 因此需要将多个 URL 重定向到客户端应用程序 我不确定如何进行通配符匹配才能正确执行此操作 目前我只是匹配多个级别的路径 如下所示 ap
  • Javascript - window.getCompulatedStyle 返回“auto”作为元素顶部和左侧属性

    在我的网页上 我有一些元素 div 子 div 按钮等 其位置是相对于它们所在的 div 以及彼此之间生成的 这会导致使用时的结果window getCompatedStyle the top and left属性不是数字值 而是简单的 a
  • 在 PHP 中合并文件块

    出于教育目的 我想创建文件块上传 你们怎么知道所有块何时上传 我试图从temp并重命名它们 使它们按正确的顺序排列 然后与最后一个块将它们合并在一起 然而 我猜最后发送的并不是最后收到的 所以fopen on chunks 失败 因为它们尚
  • 如何在 React 组件中使用 CDN

    我正在尝试使用基于 D3 构建的库 称为 Greuler 来动态渲染图形 它的 npm 包似乎已损坏 当我改用 Greuler CDN 时 index html 中的测试图终于起作用了 但是 我正在开发一个 React 应用程序 并且我希望
  • 在 JavaScript 中对数组进行排序

    我正在尝试对内部包含整数的数组进行排序 例如 var array 123 3 745 4 643 5 643 2 我如何对其进行排序才能返回类似以下内容的内容 array 745 4 643 2 643 5 123 3 您可以将自定义比较函
  • d3js v5 + Topojson v3 关于加入 csv 和 json 的优化

    为了制作地图 我需要将一些值从 csv 导入到 json直接在代码中 为了加载 json 和 csv 文件 我使用 Promise 对象的异步操作 并使用两个循环和一个公共键在 json 文件上添加新属性 for var i 0 i lt
  • 过滤文件上传仅用于文本文件

    我使用的是 Firefox 版本 14 0 1 我需要过滤上传文件窗口以仅显示 txt files 我的浏览器不仅仅支持文本文件 text plain 我可以通过指定此格式来限制图像文件 image 但我只需要过滤文本文件在文件选择器窗口中
  • 指令可以从父作用域中删除自身吗

    假设我有以下代码 div div div div 我的自定义指令有一个独立的范围 定义为 app directive customDirective function log return restrict E templateUrl te
  • 为什么我会失去对元素的引用?

    我偶然发现了一些奇怪的东西 至少对我来说 案例如下 我选择一个元素 child1 从 DOM 并将其保存到变量中 我继续添加一个新元素child1的家长 parent1 现在 如果我尝试修改某些值child1它不记录更改 似乎引用已经消失
  • React:在哪里扩展对象原型

    我使用创建了一个纯 React 应用程序创建反应应用程序 https github com facebookincubator create react app 我想延长String类并在一个或多个组件中使用它 例如 String prot
  • 接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

    我正在使用 Angular 7 2 当我进入ng serve 我面临以下问题 致命错误 接近堆限制的无效标记压缩分配失败 JavaScript 堆内存不足 这意味着什么 我该如何解决这个问题 完整的错误消息是 FATAL ERROR Ine
  • 如何对对象数组调用reduce来求和它们的属性?

    说我想求和a x对于中的每个元素arr arr x 1 x 2 x 4 arr reduce function a b return a x b x gt NaN 我有理由相信a x is undefined在某一点 以下工作正常 arr
  • 嵌套对象的 setState

    我有一个嵌套对象作为状态 并且在组件中有一个表单 我正在考虑每次用户在表单中输入某些内容时更新状态 并且为了避免为每个输入创建许多函数 我正在考虑使用 switch 创建单个函数 使用 switch 创建单一函数是个好主意吗 如何更新对象的
  • 只允许在输入字段中输入数字

    我想要打开电话号码字段这个网站 http myfrugaltech com dev savoo register 只接受数字或数字 我无权编辑 HTML 代码 那么可以使用 jQuery 通过定位字段 ID 来完成此操作吗 如果可以的话 该
  • 在 JSON 对象中存储和发送原始文件数据

    我正在寻找一种方法来传输任何文件类型的原始文件数据和任何可能的内容 我的意思是文件和文件内容都是用户生成的 在 Backbone 前端中使用 xhr ajax 调用两种方式针对 Django 后端 编辑 也许问题仍然不清楚 如果您在 IDE
  • localStorage 获取 NULL?

    我不知道为什么 因为我之前已经这样做过并且工作正常 我认为这可能是因为浏览器问题 错误 localStorage setItem foo bar alert localStorage getItem foo 我使用的是 Firefox 3

随机推荐

  • 使用带有 XLSX.js 的 Alasql JavaScript 库导出到 csv 不适用于 Safari。 - Angularjs

    我想在我的应用程序中导出 csv 格式的表数据 我已将 Alasql 库与 XLSX js 一起使用 它适用于所有现代浏览器 Chrome Firefox 但不适用于 Safari None
  • 从 http://xbrl.sec.gov/ 搜索所有埃德加数据

    我需要从 xbrl 站点以 XML 格式或 RSS Feed 形式获取所有 Edgar 搜索数据 这与此链接上的搜索相同http www sec gov edgar searchedgar cik htm http www sec gov
  • svn 无法在文件中设置位置指针

    我遇到了一个 svn 存储库的问题 该存储库到目前为止一直运行良好 我收到错误 svnadmin Can t set position pointer in file repository db revs 0 783 Invalid arg
  • GLSL 片段着色器语法错误

    以下简单的片段着色器代码失败 在日志中留下一条无信息的消息 ERROR 0 1 gl Color syntax error syntax error void main vec4 myOutputColor gl Color gl Frag
  • 如何更改组合框控件中的下拉按钮?

    如何更改下拉按钮ComboBox控件 C Windows 窗体 我有一个自定义按钮 我想在ComboBox而不是默认的下拉按钮 我认为汉斯 帕桑特的解决方案就是这样 从这里 http social msdn microsoft com fo
  • 从 Android Studio 将 Libgdx 游戏导出为可执行 Jar

    好吧 我使用 Libgdx 制作了一个游戏 我打算将它作为一个 Android 应用程序 这就是我使用 Android Studio 的原因 但我想让我没有 Android 手机的朋友尝试一下 该项目已经针对桌面和 Android 设置 因
  • iOS5 中的“应用程序试图以模态方式呈现活动控制器”错误

    我遇到一个错误 导致我的应用程序仅在 iPad 上的 iOS5 下崩溃 当用户点击 uibarbuttonitem 中的项目时 将调用以下代码 void optionSelected NSString option self optionP
  • AppEngine 响应时间差异

    我正在考虑使用 AppEngine 来部署我正在开发的网络应用程序 作为我对 AppEngine 平台调查的一部分 我一直在检查简单请求的响应时间 为此 我编写了一个简单的 PING servlet SuppressWarnings ser
  • R:计算抛硬币的频率

    我正在使用 R 编程语言 我模拟了这个包含 1000 次硬币翻转的数据集 然后我计算了 2 个翻转序列 的数量 Coin lt c H T Results sample Coin 1000 replace TRUE My Data data
  • Node.js 隔离物是什么?为什么他们现在都死了?

    在0 7 0中 实验分离支持 http blog nodejs org 2012 01 16 node v0 7 0 unstable 原文如此 已推出 除了一些模糊的想法之外 我一直不理解这一点 即它们提供了类似线程的功能 但没有线程的问
  • g.i.cs 文件丢失,类不再包含 InitializeComponent 的定义

    我在业余时间开发了一个 UWP 项目 以掌握 UWP MVVM 和 Prism 该项目最初非常经典 没有使用 MVVM 和 Prism 我一直在努力将这两个纳入该项目 我一直依赖着https msdn microsoft com en us
  • 如何在ARKit中使用环境贴图?

    ARKit 2 0 添加了一个名为 AREnvironmentProbeAnchor 的新类 阅读它的说明 似乎 ARKit 可以自动收集环境纹理 立方体贴图 我相信我们现在可以创建一些反映真实环境的虚拟对象 但我仍然不清楚这是如何工作的
  • Swift 包管理器有本地缓存​​吗?

    每次我加载新包时 Xcode 都会从 Github 重新下载所有依赖项 而不是重用我已经为其他项目加载的一些依赖项 例如 我希望当我引用时 package name SwiftyJSON url https github com Swift
  • 如何查找表的当前大小(在内存中)?

    我有一个使用 engine MEMORY 指定的内存表 我可以运行什么命令来了解它当前占用了多少空间 最大尺寸怎么样 SHOW TABLE STATUS LIKE tablename G 其中 tablename 是您要检查的表的名称
  • 如何使用 python 库找到骨架图像中的循环?

    我有很多这样的骨架图像 我如何检测骨架中的循环 是否有 特殊 函数可以执行此操作 或者我应该将其实现为图表 如果只有图形选项 python图形库NetworkX可以帮助我吗 您可以利用骨架的拓扑结构 循环不会有洞 所以我们可以使用scipy
  • Keras ImageDataGenerator:随机变换

    我有兴趣通过随机图像转换来增强我的数据集 我正在使用 Keras图像数据生成器 https keras io preprocessing image imagedatagenerator 并且我在尝试申请时收到以下错误random tran
  • 俄罗斯方块棋子旋转算法

    表示和旋转俄罗斯方块游戏棋子的最佳算法 和解释 是什么 我总是发现片段轮换和表示方案令人困惑 大多数俄罗斯方块游戏似乎在每次旋转时都使用天真的 重新制作块数组 http www codeplex com Project ProjectDir
  • 使用 WPF 更改与窗口大小相关的字体大小?

    是否有可能 如果缩小窗口 FontSize 会变小 如果放大窗口 FontSize 会变大 将您的文本包裹在Viewbox
  • 视图内变量的范围是什么?

    如果我在 ASP NET MVC 视图中有如下代码 然后在页面下方 我在另一个代码渲染块中创建另一个脚本 我可以重复使用吗admin变量 它会记住页面上层的状态 还是范围就在 blocks 以下是我注意到的有关 MVC 范围的内容 内容控件
  • 如何测试 angularjs 指令来监视函数调用?

    下面的代码执行但抱怨 element popover 没有被调用 我似乎无法弄清楚问题是什么 提前感谢您的帮助 指示 angular module directives directive popOver function http ret