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

标签 javascript node.js tdd mocha.js chai

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

我正在使用 Mocha 和 Chai,但我对任何其他断言库持开放态度。


好的,因此使用 sinon 测试是否正在调用方法非常容易。我不确定是否要测试是否正在调用外部函数。所以我更新了这些例子来代表一些更“真实世界”的东西。我正在开发一个 Node 应用程序,所以 foo.jsbar.js 都是模块。

示例:

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,但我找不到实现第二个和第三个测试的方法。

最佳答案

所以这个问题真的是二合一的。

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

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

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

我得出的结论是,在调用另一个模块时,您应该只是中断 TDD 循环而不是对此进行测试,因为它可能只是少量代码,并且该模块已经自行测试过。

如果您正在调用一个在您的模块中声明的私有(private)函数并且想要对其进行测试,您应该编写一个更广泛的测试来测试该函数被调用的结果,而不是测试该函数是否被调用或函数中实际发生了什么。

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

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');

  });

};

关于javascript - 如何测试函数是否调用特定的方法/函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26704677/

相关文章:

javascript - 为什么像 Hotjar 和 Google Analytics 这样的网站使用复杂的跟踪代码而不是仅仅使用 <script> 标签?

javascript - 如何将一维整数数组从 QML 发送到 C++?

javascript - NodeJS + TinyURL - 将项目添加到列表中

mysql - 从 NodeJS 中的 mysql 查询中提取信息

java - 测试 CloseableIterator 接口(interface)

php - Composer 建议的内部包方法

javascript - 使用 JQuery Autotab 插件,是否可以创建一个仅接受 6 位数字的字段?

javascript - 如何防止 Vue Js 组件中事件监听器的多次调用?

node.js - Cassandra nodejs DataStax 驱动程序不通过准备好的语句执行返回新添加的列

node.js - Mocha如何在没有pha​​ntomjs的情况下进行DOM测试