如何测试 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 指令来监视函数调用? 的相关文章

随机推荐

  • 使用带有 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