如何使用Gently来存根未被模块立即暴露的对象的方法?

时间:2013-02-22 15:30:45

标签: node.js unit-testing stubbing

我正在使用AWS SDK作为NodeJS。

我有一个模块(moduleFoo)设置如下:

if (global.GENTLY) { require = GENTLY.hijack(require); }

var aws = require("aws-sdk"),
    ec2;

exports.initEC2Client = function () {
    ec2 = new aws.EC2();
};

exports.doSomething = function () {
    var params;

    // params gets populated here...

    ec2.Client.describeInstances(params, function (err, data) {
        // logic!
    }
}

我正在尝试删除describeInstances方法。

我知道我可以通过以下方式存根EC2类:

gently.stub("aws-sdk", "EC2");

我可以通过根据Gently docs来构建它的构造函数来创建一个虚假的实例:

var ec2Stub = gently.stub("aws-sdk", "EC2"),
    ec2;

gently.expect(ec2Stub, "new", function () {
    ec2 = this;
});

moduleFoo.initEC2Client();

此时我卡住了。我需要做的是隐藏属于ec2的对象的方法。有没有办法使用Gently来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我在按下提交之前输入了整个问题后找到了答案。

我通过将Client初始化为空对象然后在其上截断describeInstances方法来解决它:

var ec2Stub = gently.stub("aws-sdk", "EC2"),
    ec2;

gently.expect(ec2Stub, "new", function () {
    ec2 = this;
});

moduleFoo.initEC2Client();

ec2.Client = {};

gently.expect(ec2.Client, "describeInstances", function (params, callback) {
    // assert `params` is populated ok
    callback();
})

moduleFoo.doSomething();

gently.verify(); // throws no error