如何测试 javascript 方法是否创建一个对象并调用该对象上的方法

How to test that a javascript method creates an object and calls a method on that object

本文关键字:方法 一个对象 调用 对象 创建 是否 何测试 测试 javascript      更新时间:2023-09-26

我正在更新用nodejs编写的服务器代码,并尝试随时添加单元测试,但对于以下情况,我找不到好的解决方案:

classX.prototype.methodX = function () {
    // Create new session
    var session = new classY();
    // Add the new session to the global list
    self.sessions[session.sessionId] = session;
    session.sendPushNotificationToCallee(); }

我可以轻松测试会话对象是否已添加到会话列表中,但是如何检查是否确实调用了sendPushNotificationToCallee?我的初衷是使用 sinon.js间谍,但我找不到一种方法来做到这一点,因为对象是在方法中创建的......

谢谢

如果您的代码满足以下假设,则非常简单:

  1. classY是一个标准的JS构造函数,即它的方法在其原型上定义。这意味着您可以将您的 sinon 间谍附加到那里。
  2. classXclassY位于单独的模块中。因为node的require是一个单例,这意味着你可以在测试中require('classY'),你会得到与classX模块完全相同的对象。

那么一个简单的测试将如下所示:

var classX = require('./classX'); // module under test
var classY = require('./classY'); 
var sinon = require('sinon');
var assert = require('assert');
// spy on a method
var spy = sinon.spy(classY.prototype, 'sendPushNotificationToCallee');
// instantiate the class and call the method under test
var instance = classX();
instance.methodX();
// test
assert.ok(spy.calledOnce);
// restore orignal method
classY.prototype.sendPushNotificationToCallee.restore();