Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 监视函数sinon返回的函数_Javascript_Testing_Sinon - Fatal编程技术网

Javascript 监视函数sinon返回的函数

Javascript 监视函数sinon返回的函数,javascript,testing,sinon,Javascript,Testing,Sinon,我对Sinon有点陌生,在这种情况下,我不仅需要监视函数,而且还需要监视函数返回的函数。具体地说,我试图模拟Azure Storage SDK,并确保创建队列服务后,队列服务返回的方法也会被调用。下面是一个例子: // test.js // Setup a Sinon sandbox for each test test.beforeEach(async t => { sandbox = Sinon.sandbox.create(); }); // Restore the s

我对Sinon有点陌生,在这种情况下,我不仅需要监视函数,而且还需要监视函数返回的函数。具体地说,我试图模拟Azure Storage SDK,并确保创建队列服务后,队列服务返回的方法也会被调用。下面是一个例子:

// test.js

// Setup a Sinon sandbox for each test
test.beforeEach(async t => {

    sandbox = Sinon.sandbox.create();
});

// Restore the sandbox after each test
test.afterEach(async t => {

    sandbox.restore();
});

test.only('creates a message in the queue for the payment summary email', async t => {

    // Create a spy on the mock
    const queueServiceSpy = sandbox.spy(AzureStorageMock, 'createQueueService');

    // Replace the library with the mock
    const EmailUtil = Proxyquire('../../lib/email', {
        'azure-storage': AzureStorageMock,
        '@noCallThru': true
    });

    await EmailUtil.sendBusinessPaymentSummary();

    // Expect that the `createQueueService` method was called
    t.true(queueServiceSpy.calledOnce); // true

    // Expect that the `createMessage` method returned by
    // `createQueueService` is called
    t.true(queueServiceSpy.createMessage.calledOnce); // undefined
});
下面是模拟:

const Sinon = require('sinon');

module.exports =  {

    createQueueService: () => {

        return {

            createQueueIfNotExists: (queueName) => {

                return Promise.resolve(Sinon.spy());
            },

            createMessage: (queueName, message) => {

                return Promise.resolve(Sinon.spy());
            }
        };
    }
};
我能够确认
queueServiceSpy
被调用一次,但我无法确定该方法返回的方法是否被调用(
createMessage

有没有更好的方法来设置这一点,或者我只是错过了什么


谢谢

您需要做的是存根您的服务函数以返回一个间谍,然后您可以跟踪到其他地方的调用。您可以任意将其嵌套到较深的位置(尽管我强烈反对这样做)

比如:

const cb = sandbox.spy();
const queueServiceSpy = sandbox.stub(AzureStorageMock, 'createQueueService')
    .returns({createMessage() {return cb;}}});

const EmailUtil = Proxyquire('../../lib/email', {
    'azure-storage': AzureStorageMock,
    '@noCallThru': true
});

await EmailUtil.sendBusinessPaymentSummary();

// Expect that the `createQueueService` method was called
t.true(queueServiceSpy.calledOnce); // true

// Expect that the `createMessage` method returned by
// `createQueueService` is called
t.true(cb.calledOnce);