如何使用 Jasmine 对 $scope.broadcast、$scope.$on 进行单元测试

2023-12-09

我是 AngularJs/NodeJs 世界的新手,所以如果这对某些人来说是一个基本问题,请原谅。

简而言之,我有两个控制器,第一个控制器$broadcast一个“Id”,第二个控制器使用该 ID 获取该 Id$on然后将该 Id 传递给中间人service,这使得$httpajax 调用并返回一个Book目的。

如何使用 Jasmine 对 $scope.broadcast、$scope.$on 进行单元测试

第一个Ctrl

.controller('firstCtrl', function($scope, ...){
    $scope.selectGridRow = function() {
        if($scope.selectedRows[0].total !=0)
            $scope.$broadcast('id', $scope.selectedRows[0].id);//Just single plain ID
    };
});

第二个Ctrl

.controller('secondCtrl',
    function($scope, bookService) {
        $scope.$on('id', function(event, id) {
            bookService.getBookDetail(id).then(function(d) {
                $scope.book = d.book;
            });
        });
    });

预期 Json 对象

var arr = "book" : [ {
            "id" : "1",
            "name" : "Tomcat",
            "edition" : "9.1"
           }
          ]

如果有人想让我发布,请告诉我$http第二个控制器使用的服务。

预期行为

因此,从我的想法来看,理想情况下,我想测试所有可能的场景,但如下所示,然后可以花费:

expect(scope.book).toEqual(arr);
expect(scope.book).not.toEqual(undefined);

感谢大家!


首先你应该在$rootScope然后你就可以收到$scope。 现在进行测试。我假设您想通过以下方式向您的 API 包含真实请求bookService and $http。这可以被嘲笑,但我将专注于真正的调用。如果您需要被嘲笑的,请告诉我。

在实际测试之前,您需要进行一些注入/实例化:

  • 初始化您的应用程序
  • Inject $controller, $rootScope, $httpBackend and bookService
  • 为firstController和SecondController创建范围并将其存储在变量中
  • Store bookService and $httpBackend在变量中
  • 实例化控制器并存储它们

那么在实际测试中你必须告诉$httpBackend当它缓存对书籍的请求时该怎么做。构造$httpBackend.whenGET("/api/books/1").passThrough();将通过 url 传递请求"/api/books/1"到服务器。 接下来您必须设置属性selectedRows on firstScope所以它满足功能条件selectGridRow在你的firstCtrl.

现在你可以调用函数了selectGridRow触发广播和 API 调用。但你必须把它包起来runs函数,因此 Jasmine 会将其识别为异步调用并等待它完成。 “等待”的定义是waitsFor称呼。它将等到它收到一本书并且等待最多 5000 毫秒,然后测试将被标记为失败。

最后一步是检查预期结果。我们不必检查undefined无论如何,测试都不会到达这里。支票必须重新包装runs调用,以便在成功“waitsFor”后执行。

这是完整的代码:

describe("Broadcast between controllers", function () {

    beforeEach(module('app')); //app initialization

    var firstScope;
    var secondScope;

    var bookService;
    var $httpBackend;

    var firstController;
    var secondController;

    beforeEach(inject(function ($controller, $rootScope, _bookService_, _$httpBackend_) {
        firstScope = $rootScope.$new();
        secondScope = $rootScope.$new();

        bookService = _bookService_;
        $httpBackend = _$httpBackend_;

        firstController = $controller('firstCtrl', { $scope: firstScope });
        secondController = $controller('secondCtrl', { $scope: firstScope, bookService: bookService });
    }));


    it("should work", function () {

        $httpBackend.whenGET("/api/books/1").passThrough();

        firstScope.selectedRows = [{ id: 1, total: 1000 }];
        secondScope.book = null;

        runs(function () {
            firstScope.selectGridRow();
        });

        waitsFor(function () {
            return secondScope.book != null;
        }, "Data not received in expected time", 5000);

        runs(function () {
            expect(secondScope.book[0].id).toEqual(1);
        });
    });

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

如何使用 Jasmine 对 $scope.broadcast、$scope.$on 进行单元测试 的相关文章

  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何修改每个JSON对象javascript

    我想修改里面的每个 JSON 值cooldown object cooldown user 1 This user2 0 This 在 Javascript 中使用 for 语句 我研究了好几个小时 只找到了内部的 blocks Edit
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb
  • 使用 Mongoose 无法找到按 ObjectId 搜索的文档

    Campaign find client id req param client id error campaigns gt if error response error error message else for campaign i
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接

随机推荐

  • Google Calendar Api 获取本周的活动

    我正在尝试使用 Google Api 从一个公共 Google 日历获取本周的活动列表 我的所有配置都很好 我可以进行任何测试 在一个网页中列出和显示事件 但我使用服务器日期搜索任何类型的查询来获取本周的事件 但没有成功 我认为可以使用中所
  • 从 STATION 查询不以元音开头且不以元音结尾的 CITY 名称列表

    这是来自的挑战问题黑客排名 我的第一个查询工作正常 select distinct city from station where city not regexp aeiou and city not regexp aeiou 但我的第二个
  • Google 地图 api 可与浏览器检查元素配合使用

    我几天来一直在努力尝试将 google 地图 canves 插件修复到我使用 Twitter bootstrap 的应用程序中 地图充满了灰色斑点 而且从来都不是中心位置 但我最近注意到的是 一旦我在包含插件的页面上单击 检查元素 一切都会
  • Tslint 和节点模块错误

    我在使用茉莉花或黄瓜或任何框架运行角度测试时遇到问题 该应用程序是用 Angular 5 编写的 使用 TypeScript 并由 JHipster 生成 运行测试的结果是这样的 它似乎在 cmd 中持续了几个小时 没有任何变化 C Use
  • 如何使用 Amazon AWS Elastic Beanstalk 部署私有 python pip 依赖项?

    当我尝试将其中一项服务设置为AWS 弹性豆茎 问题就出现了 我们的蟒蛇之一点依赖设置于私有存储库正在引起errors在部署过程中 由于无法访问对于点进程 下面我将介绍我们如何解决这个问题 值得一提的是 还有其他解决方案将部署期间使用的 SS
  • 自定义相机旋转问题

    我有一个自定义相机覆盖层 与所有相机视图一样 默认为横向模式 我有一些方向改变逻辑 可以检测方向何时改变 这样我就可以旋转我放置的按钮和视图 另外 我还编辑了 shouldAutoRotateInterfaceTo 方法 以便在相机打开时它
  • 在 SQLite Android 中计算列的总和

    我需要计算列的总和值 为此 我使用以下查询 但是当我单击按钮进行计算时 应用程序崩溃了 Cursor cur db rawQuery SELECT SUM DbHelper CART TOTAL FROM DbHelper CART TAB
  • 如何将我的sql结果作为变量发送到codeigniter中的控制器

    在我的模式下 我选择一个字段作为 query1 this gt db gt query SELECT dPassword FROM tbl login WHERE dEmailID email protected 如何返回dpassword
  • SQL For Update 跳过锁定查询和 Java 多线程 - 如何解决此问题

    SELECT id FROM table name tkn1 SELECT id ROWNUM rnum FROM table name WHERE PROCS DT is null order by PRTY desc CRET DT r
  • 如何使用 Gson 解析 JSON 对象内的多个 JSON 数组? [复制]

    这个问题在这里已经有答案了 如何使用 Gson 解析 JSON 对象内的多个 JSON 数组 id 1 Data Details Code 1 Name John Code 2 Name Peter Other age 56 gender
  • R:在 2x2 窗口中并排放置四个点阵条形图?

    我想要并排制作 2x2 条形图的代码 以便 y 轴最大值在所有和 通用标签 通用x标签 常见的传说 通用标题 每个条形图都有自己的副标题 每个条形图之间的分隔线如图 2 所示 Code Wanted output 2x2 barchart
  • 如何在 VimScript 中获取可视化选择的文本

    我可以通过以下方式获取光标位置getpos 但我想检索所选文本within一条线 即 lt gt 这是怎么做到的 UPDATE 我想我删掉了我解释说我想要得到这段文字的部分来自 Vim 脚本 我来这里问了与主题启动者相同的问题 并尝试了 L
  • Powershell根本无法连接到互联网

    我到处寻找这个问题的答案 但我想也许我缺乏谷歌忍者技能 我正在尝试在 Powershell 中运行一个简单的命令来下载一个字符串 实际上 我想下载一个 msi 并运行它 但我已将问题范围缩小到一个简单的示例 我正在运行的脚本是 client
  • 将元标记 Drupal 模块中的描述加粗部分

    我在用着MetatagDrupal 7的模块 我想将部分描述放在bold 例如 我有以下源代码 我想将 我的新内容 加粗 是否可以 这不可能 The meta description只能包含文本 该值必须是描述页面的自由格式字符串 即使您输
  • 在 Linq 中传递参数

    我在一个方法中有以下代码 someData table AsEnumerable Where row gt row someRow Equals Something Sum row gt row AnotherRow 在最后一行 我想从其他
  • gii 会自动为生成的模型创建关系吗?

    我是 Yii 的新手 在文档中 似乎暗示gii将为相关模型创建关系 但是当使用gii从DB生成模型时 情况似乎并非如此 例如 我有一个用户表和一个配置文件表 其中包含 user id INTEGER DEFAULT 0 列 但生成的模型中的
  • 在应用程序中检测 Google Play 来源

    我想知道是否可以在应用程序中找到它是从哪个 Google Play 商店 国家 地区下载的 像这样的解决方案 在有人下载应用程序后 我们获取 GPS 信息来找出用户所在的位置 这是不可行的 我正在询问可用于实现此目的的 Google Pla
  • JSF - 组件库,迁移还是不迁移?

    我正在使用一个名为 Woodstock 的旧组件库 每当我尝试更改某些内容时 我都会遇到找不到有关该库的足够文档的问题 我正在考虑迁移到另一个库 例如 ICE Faces 或 Prime Faces 但我怀疑迁移到另一个库将在 3 4 年内
  • 如果由递归函数调用,paintComponent 不起作用?

    I want to see all the Points one after another but I see only able to see 1 point What shold I change to see all the Poi
  • 如何使用 Jasmine 对 $scope.broadcast、$scope.$on 进行单元测试

    我是 AngularJs NodeJs 世界的新手 所以如果这对某些人来说是一个基本问题 请原谅 简而言之 我有两个控制器 第一个控制器 broadcast一个 Id 第二个控制器使用该 ID 获取该 Id on然后将该 Id 传递给中间人