如何测试javascript方法创建对象并在该对象上调用方法

时间:2015-01-08 15:19:52

标签: javascript node.js unit-testing sinon

我正在更新用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 个答案:

答案 0 :(得分:2)

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

  1. classY是标准的JS构造函数,即。它的方法在其原型上定义。这意味着你可以将你的sinon间谍附加在那里。
  2. classXclassY位于单独的模块中。由于节点的require是一个单例,这意味着您可以在测试中require('classY'),并且您将获得与classX模块中完全相同的对象。
  3. 然后一个简单的测试将如下所示:

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