如何测试 javascript 方法创建对象并调用该对象的方法
How to test that a javascript method creates an object and calls a method on that object
我正在更新用 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 间谍,但我找不到方法来做到这一点,因为对象是在方法中创建的...
谢谢
如果您的代码满足以下假设,那就非常简单了:
classY
是标准的 JS 构造函数,即。它的方法在其原型上定义。这意味着你可以在那里附加你的 sinon 间谍。
classX
和 classY
位于单独的模块中。因为节点的 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();
我正在更新用 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 间谍,但我找不到方法来做到这一点,因为对象是在方法中创建的...
谢谢
如果您的代码满足以下假设,那就非常简单了:
classY
是标准的 JS 构造函数,即。它的方法在其原型上定义。这意味着你可以在那里附加你的 sinon 间谍。classX
和classY
位于单独的模块中。因为节点的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();