使用 RequireJS(和 Jasmine/Sinon)时如何在另一个视图渲染方法中存根 Backbone View 实例化

2024-03-16

我正在尝试使用 Jasmine 和 Sion 编写单元测试,但在使用 RequireJs 加载模块时,我很难找到与以下内容等效的内容:

sinon.stub(window, "MyItemView");

使用 RequireJs 时,我无法以这种方式存根,因为 MyItemView 未附加到窗口。

以下是我需要存根 MyItemView 时的示例:

var MyView = Backbone.View.extend({
el: '#myElement',
initialize : function() {
    var that = this;
    this.collection.fetch({
        success : function() {
            that.render();
        }
    });
},

render : function() {
    this.collection.each(this.renderItem);
}

renderItem: function(model){
        var myItemView = new MyItemView({model: model});
        $('#myElement').append(myItemView.render().el);
    },

...

现在,使用 Jasmine 我可以测试 insideHtml 是否包含预期的 HTML:

it('View should contain correct Html', function(){
            var collectionFetchStub = sinon.stub(this.myCollection, 'fetch').yieldsTo('success', this.myCollection);
            this.view = new MyView({collection: this.myCollection});
            expect(this.view.el.innerHTML).toContain('<li><a href=""> 1 : test </a></li>');

            // Remove Stubs
            collectionFetchStub.restore();
        });

但是,此测试依赖于 MyItemView 的渲染,这对于单元测试来说并不理想。这个问题的最佳解决方案是什么?我对 javascript 很陌生,这个问题的解决方案似乎很复杂。


看一眼this SO https://stackoverflow.com/questions/11439540/how-can-i-mock-dependencies-for-unit-testing-in-requirejs/11695463#11695463关于如何使用 requireJS 存根依赖关系。有一些解决方案。就像 testrJs、squireJs 或我自己的小解决方案一样。主要思想是用您的间谍/存根/模拟覆盖 requireJs 依赖项,以便您可以仅测试模块。

因此,在您的情况下,您可以像这样存根 MyItemView:

var el = $("<div>test</div>")
var MyItemView = sinon.stub().returns({render: sinon.stub().returns(el)})

然后你必须将 MyItemView 存根注入到你的 require 上下文中,你可以测试测试 div 是否附加到$('#myElement')。这并不理想,因为所有的 DOM 东西都会起作用,但它会起作用。更好的方法是不要渲染主干视图之外的东西。因为那么你可以注入一个模拟的el进入视图并测试是否调用了模拟的追加方法。

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

使用 RequireJS(和 Jasmine/Sinon)时如何在另一个视图渲染方法中存根 Backbone View 实例化 的相关文章

随机推荐

  • 跨子域 iframe 和 JavaScript

    我正在开发一个 CMS 网站 其域名是 http www acmssite com 他们有一个存储表单系统的子域 http www forms acmssite com 我在第一个上有一个 iframe 它查看后者中的表单 我需要运行脚本来
  • currval 尚未定义此会话,如何获取多会话序列?

    我的目标是在表中插入新行时自动插入主键字段 如何在 PostgreSQL 中获取从一个会话到另一个会话的序列 doubleemploi hanbei home yves psql d test Mot de passe psql 8 4 1
  • Jenkins 针对特定分支的 git commit 触发器也会为其他分支构建作业

    我们有一个内部企业 Github 存储库 并且我有多个功能分支 我面临着在特定分支上触发构建的问题 我已经为每个功能分支配置了作业 一个功能分支有一份詹金斯工作 我第一次提交代码时 它还会触发其他分支的作业构建 重现问题的步骤 1 我们有一
  • dBWriteTable 无法将 NULL 写入 SQL Server 表

    ISSUE 无法将 NA 值从 data frame 插入到数据库表 STEPS 将表从 SQL Server 读入 Rdata frame 表是十进制的 有一些NULL data frame 是数字 有一些NA dBWriteTable抛
  • 具有旧 Facebook 应用程序版本的 Facebook SDK 3.0 重定向到浏览器并卡住

    我的应用程序中有一个 FB AuthButton 正在连接到 FB 进程我的设备正在运行旧版本的 FB 应用程序 版本 1 8 3 1 8 4 当我单击登录按钮时 该过程不会启动本机应用程序 而是调用浏览器来完成该过程 在日志中 我看到这些
  • Javascript 可以检查文件的内容更改吗?

    Example I have var r new FileReader r onload function e drawGraph r result r readAsText f 从用户输入的文件 f 绘制图形 有没有办法检查文件 f 是否
  • 使用 Java 布局管理器的目的是什么?

    似乎每当我尝试创建一个程序时 我总是会使用setLayout null 在 Java 中使用命令 因为我喜欢绝对定位我要放入 Swing 组件上的任何内容 从我读到的内容来看 每个人都在说使用布局管理器来简化编码过程 但它是如何简化的呢 平
  • 从Android手机内存中读取文本文件

    我只想在手机内存中创建一个文本文件 并且必须读取其内容才能显示 现在我创建了一个文本文件 但它不存在于路径 data data package name file name txt 中并且它没有在模拟器上显示内容 我的代码是 public
  • 完整日历 - 拖放 - 自定义

    我正在使用 React 调度程序 FullCalendar 我喜欢保留拖放功能来将事件从一种资源更改为另一种资源 但是有没有办法禁止水平拖动来改变时间呢 同样现在 拖放的工作方式就像事件将从一个资源粘到另一个资源一样 并且没有平滑的拖动操作
  • 如何使用 jQuery UI 调整 datatables.js 列的大小

    我在 stackoverflow 中找到了调整表列大小的解决方案 jQuery UI 使用表格和 colspan 调整大小 https stackoverflow com questions 18812432 jquery ui resiz
  • 图实现C++

    我想知道如何用 C 快速编写图的实现 我需要数据结构易于操作和使用图算法 例如 BFS DFS Kruskal Dijkstra 我需要这个实现来参加算法奥林匹克竞赛 因此编写数据结构越容易越好 你能建议这样的DS 主要结构或类以及其中的内
  • 找不到满足 torch>=1.0.0 要求的版本?

    找不到满足要求的版本 torch gt 1 0 0 找不到 torch gt 1 0 0 的匹配发行版 来自 stanfordnlp 如果您的 Python 版本太新 也可能会发生这种情况 目前使用 Pytorch不支持3 7 9以上版本
  • InvalidDataAccessApiUsageException:执行更新/删除查询 Spring XML 到 Java 配置

    我正在尝试将 spring xml 配置转换为 java 配置 通过 XML 配置可以完美地实现这一点 但是 如果我使用 java 配置初始值设定项 它会引发以下异常 当它尝试运行 JQL 时会发生这种情况 但应用程序正常启动 所有 JPA
  • CocoaPods 错误:RPC 失败; curl 18 传输已关闭,剩余未完成的读取数据

    当我尝试使用 CocoaPods 导入 Realm 时 如下所示 pod install verbose no repo update 然后发生错误 error RPC failed curl 18 transfer closed with
  • 引用c++中的引用

    我正在研究 C 中的参考概念 并且我对 C 完整参考中的这个陈述有点困惑 您不能引用其他引用 那么在这种情况下发生了什么 int var 10 int ref var int r ref ref r ref cout lt lt var l
  • 返回两个圆之间的 x,y 交点的 JavaScript 函数?

    我得到了两个圆的 x y 中心位置及其半径 但我需要使用 JavaScript 找到它们的交点 用红色标记 我认为就数学而言最好的解释已经找到here http paulbourke net geometry circlesphere 两个
  • LEFT OUTER JOIN SUM 双倍问题

    表 购物 shop id shop name shop time 1 Brian 40 2 Brian 31 3 Tom 20 4 Brian 30 表 香蕉 banana id banana amount banana person 1
  • 在数组第三维上应用函数

    我有一个大数组 这是一个可复制的示例 cube lt array c 1 10 5 15 5 5 1 18 c 4 4 3 cube 1 1 2 3 4 1 1 5 9 7 2 2 6 10 8 3 3 7 5 9 4 4 8 6 10 2
  • 添加条目到task_struct并初始化为默认值

    我想添加一个条目到进程控制块结构 task struct 让我们说一种标记某些进程的方法 我想将除 一些特殊进程 之外的所有进程的该字段初始化为 0 稍后通过调用sched setscheduler 我将为 特殊进程 设置此标志 有谁知道如
  • 使用 RequireJS(和 Jasmine/Sinon)时如何在另一个视图渲染方法中存根 Backbone View 实例化

    我正在尝试使用 Jasmine 和 Sion 编写单元测试 但在使用 RequireJs 加载模块时 我很难找到与以下内容等效的内容 sinon stub window MyItemView 使用 RequireJs 时 我无法以这种方式存