如何测试函数是否调用特定方法/函数?

2024-04-01

Mocha 有没有办法测试函数是否调用特定方法或外部函数?

我将 Mocha 与 Chai 一起使用,但对任何其他断言库持开放态度。


好的,所以使用 sinon 测试是否正在调用 methid 是非常容易的。我不确定是否要测试是否正在调用外部函数。因此,我更新了示例以代表一些更“真实的世界”。我正在开发一个节点应用程序,所以foo.js and bar.js都是模块。

Example:

foo.js

var bar = require('bar');
var xyz = function () {};

var Foo = module.exports = function () {
  this.bar();
  bar();
  xyz();
};
Foo.prototype.bar = function () {};

bar.js

var bar = module.exports = function () {};

fooSpec.js

var chai      = require('chai');
var sinon     = require('sinon');
var sinonChai = require('sinonChai');
var expect    = chai.expect;
var Foo       = require('../lib/foo');

chai.use('sinonChai');

describe('Foo', function () {

  var method;

  beforeEach(function (done) {
    method = sinon.spy(Foo.prototype, 'bar');
    done();
  });
  afterEach(function (done) {
    method.restore();
    done();
  });

  it('should call Foo.prototype.bar() immediately', function () {

    new Foo();
    expect(method).to.have.been.called;
    
  });

  it('should call the module bar immediately', function () {
    // ????????????
  });

  it('should call xyz() immediately', function () {
    // ????????????
  });
});

正如你所看到的,我已经弄清楚如何测试Foo.prototype.bar,但我找不到实现第二个和第三个测试的方法。


所以这个问题实际上是二合一的。

Firstly,“如何测试方法是否被调用”: 我在示例中为此列出了代码,但基本上,使用 sinon.js,您只需将该方法包装在“spy”中,这允许您编写一个期望调用该间谍的测试。

Secondly,“如何测试私有函数(未作为模块的一部分导出的函数)是否已被调用”:

基本上,你不知道。在测试环境中而不是在生产环境中导出这些函数是可能的,但这对我来说似乎有点太老套了。

我得出的结论是,当调用另一个模块时,您应该只是打破 TDD 周期而不是对此进行测试,因为它可能只是少量代码,并且该模块已经自己进行了测试。

如果您正在调用模块内声明的私有函数并想要测试它,您应该编写一个更广泛的测试来测试调用该函数的结果,而不是测试该函数是否正在被调用或实际是什么发生在函数内部。

这是一个非常简单的例子:

foo.js

var _ = require('lodash');

var Foo = module.exports = function (config) {

  this.config = _.merge({
      role: 'user',
      x: '123',
      y: '321'
    },
    config);

  this.config.role = validateRole(this.config.role);
};

var validateRole = function (role) {
  var roles = [
    'user', 'editor', 'admin'
  ];

  if (_.contains(roles, role)) {
    return role;
  } else {
    return 'user'
  }
};

fooSpec.js

var chai = require('chai');
var expect = chai.expect;
var Foo = require('../lib/foo');

describe('Foo', function () {

  it('should set role to \'user\' if role is not valid', function () {

    var foo = new Foo({role: 'invalid'});
    expect(foo.config.role).to.equal('user');

  });

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

如何测试函数是否调用特定方法/函数? 的相关文章

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

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • 在新的 Google 协作平台 <嵌入 HTML> 中使用 localStorage 和 IndexedDB 不起作用

    我正在尝试将新的 Google 协作平台用于我开发的网页 但是 我在存储本地数据时遇到了问题 本地文件在 Windows 和 Apple safari chrome 中运行良好 从 Google 协作平台尝试一下 没有什么乐趣 此外 在 s
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Node js,通过管道将 pdfkit 传输到内存流

    我在用pdfkit https github com devongovett pdfkit在我的节点服务器上 通常创建 pdf 文件 然后将它们上传到 s3 问题是 pdfkit 示例将 pdf 文档通过管道传输到节点写入流 该节点写入流将
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 由于 REPO url 被阻止,Primefaces 依赖项无法导入

    我正在开发一个基于 Maven 的 Spring 项目 我为 Primefaces 添加了以下依赖项
  • Angular Reactive Forms Control:如何绑定单选按钮?

    我在用着ReactiveFormsModuleAngular2 创建一个包含表单的组件 这是我的代码 foo component ts constructor fb FormBuilder this myForm fb group name
  • Android WebView 需要打开外部 URL 的权限吗?

    我正在尝试以下示例 但使用外部 URL 使用 WebView http android developers blogspot com 2008 09 using webviews html 该示例展示了如何从资产文件夹 file url
  • 2 个 div 50% 内联块彼此不相邻

    我对这个盒子模型有疑问 我只在 Blackberry 4 6 上遇到此问题 但在 jsbin jsfiddle 上也出现此问题 这 2 个 div 应该是 50 因此直接相邻 但最后一个出现故障 jsbin http jsbin com o
  • 在 C++ 中实现等价关系(使用 boost::disjoint_sets)

    假设您有许多元素 并且需要跟踪它们之间的等价关系 如果元素A等价于元素B 则它等价于B所等价的所有其他元素 我正在寻找一种有效的数据结构来编码这些信息 应该可以通过与现有元素的等价来动态添加新元素 并且根据该信息应该可以有效地计算新元素等价
  • F# 类型提供程序用例

    我很难掌握类型提供者 我想获得一些关于类型提供程序方法对于以下用例的有用性的反馈 非常不幸的是 我们的遥测 API 返回对象为List
  • (Python) Flask - request.args.get 返回 NoneType

    我需要完成这个网站的就是让它抓住n and s来自输入的值 但是执行时request get args每次都返回 None 这是代码 my website py import sqlite3 from flask import Flask
  • ConstraintLayout 1.1.0 与 1.0.2 不同,是一个 bug 吗?

    如果我使用1 0 2 则3个图像的宽度是平均的 并且它们的高度是由我设置的收音机计算的 如果我使用1 1 0 它们的高度是0dp我什么也看不见 除非我设置 android layout height match parent 在根部Cons
  • 在Java中如何比较双精度数序列都“近似相等”?

    我在java中有一个返回双精度数字的方法 我想比较每次调用该方法 比如5次 返回的每个双精度数字 这样我就可以得出结论 每次返回的数字几乎相同 我怎样才能做到这一点 public static boolean almostEqual dou
  • Spring Data Elastic 从 3.x 迁移到 4.x 的索引问题

    在我们使用的整体应用程序中JHIPSTER 6 10 5 我们正在使用Spring Data Elastic 版本 3 3 1 with 弹性搜索版本 6 8 8 我们有多个 ManyToOne and OneToMany与 100 多个实
  • CPU 百分比超过 100 的 Docker 统计信息

    我有一个关于 docker stats 命令的问题 如果有人可以帮助我 我是 Docker 领域的新手 我想监控 docker 容器的 cpu 使用情况 物理机有 8 个核心 CPU0 CPU7 我已经创建了一个容器 并使用以下命令将其 c
  • asp:BoundField 查看带条件的值

    我有一个数据视图
  • Autofac 在 Web.Config 上丢失注册编辑

    我有一个使用 ASP NET MVC 4 WebAPI 和其他一些组件构建的分层 Web 应用程序 我使用最新版本的 Autofac 2 6 2 859 作为我的 DI 容器以及 MVC 和 WebAPI 集成 我在不同的层中设置了 aut
  • 为什么火花计数动作分三个阶段执行

    我已经加载了一个 csv 文件 将其重新分区为 4 然后对 DataFrame 进行计数 当我查看 DAG 时 我发现此操作分 3 个阶段执行 为什么这个简单的动作要分三个阶段执行 我想第一阶段是加载文件 第二阶段是查找每个分区的计数 那么
  • C++静态成员变量初始化是线程安全的吗?

    根据以下资源 在 C 特别是 Visual C 中 作用域静态变量初始化不是线程安全的 但是 全局静态变量是安全的 没有互斥的线程安全静态变量 https stackoverflow com questions 1052168 thread
  • FragmentTransaction 替换不起作用

    我已经在stackoverflow上搜索过这个问题并找到了这两个解决方案 将一个片段替换为活动组内的另一个片段 https stackoverflow com questions 5658675 replacing a fragment w
  • 使用 EP Plus 允许工作表上有前导零

    您好 我正在将 Ep Plus 与网络应用程序一起使用 我正在创建一个 Excel 文件 用户可以填写该文件并将其上传回应用程序 当我输入带有前导零的数字时 它们会被截断 是否可以允许用户输入前导零 这个问题的公认答案对我来说不起作用 我发
  • Bootstrap v4.0 右侧的汉堡包项目

    Silly question Working with Bootstrap v4 0 How can we put hamburger items on the right side instead of left side Basical
  • 在 C# 中如何将小数转换为 int?

    如何将小数转换为整数 Use Convert ToInt32 from mscorlib as in decimal value 3 14m int n Convert ToInt32 value See MSDN http msdn mi
  • 如何测试函数是否调用特定方法/函数?

    Mocha 有没有办法测试函数是否调用特定方法或外部函数 我将 Mocha 与 Chai 一起使用 但对任何其他断言库持开放态度 好的 所以使用 sinon 测试是否正在调用 methid 是非常容易的 我不确定是否要测试是否正在调用外部函