Как использовать Gently, чтобы заглушить метод объекта, который не сразу отображается модулем?

Я использую SDK AWS для 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. Есть ли способ приблизиться к этому, используя мягко?


person Andrey    schedule 22.02.2013    source источник


Ответы (1)


Я обнаружил ответ после того, как набрал весь вопрос, как раз перед тем, как нажать «Отправить».

Я решил это, инициализировав 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
person Andrey    schedule 22.02.2013