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

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(使用前将#替换为@)

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

随机推荐

  • 由于 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 是非常容易的 我不确定是否要测试是否正在调用外部函