使用proxyquire和mocha在单元测试中模拟方法调用时如何模拟时间延迟(超时)?

Ant*_*gov 3 mocha.js node.js proxyquire

在测试模块 A 中的方法时,我使用 proxyquire 模拟模块 B 的方法(在模块 A 中注入了 require())。模拟(mocking ad.model.js 模块的 get_campaigns 方法):

const admitadModelMock = {
    '../services/admitad.model': {
        get_campaigns: (limit, page) => new Promise((resolve, reject) =>
            setTimeout(resolve({campaigns: testData, count: 1000}), 5000)
        ),
    },
};
Run Code Online (Sandbox Code Playgroud)

考试:

it('shold get all campaigns from Admitad', async function () {
    this.timeout(60000);
    let err, data;
    // mock dependencie (get_campaigns() of module B will be mocked):
    let $serviceStubbed = proxyquire('../services/campaign-sync', admitadModelMock);
    // getAdmitadCampaigns() just calls get_campaigns method of module B
    [err, data] = await to($serviceStubbed.getAdmitadCampaigns(50));
    data.length.should.be.equal(50);
});
Run Code Online (Sandbox Code Playgroud)

问题是测试通过而没有预期的 5 秒延迟。

更新。

这是有效的:

setTimeout(() => resolve({campaigns: mockedCampaigns, count: 1000}), 2000)
Run Code Online (Sandbox Code Playgroud)

这是我最后的好方法:

setTimeout(() => resolve({campaigns: mockedCampaigns, count: 1000}), 2000)
Run Code Online (Sandbox Code Playgroud)

exp*_*rer 5

setTimeout(resolve({campaigns: testData, count: 1000}), 5000)
Run Code Online (Sandbox Code Playgroud)

上面的线路呼叫流程可以解释如下。

let res = resolve({campaigns: testData, count: 1000});
setTimeout(res, 5000);
Run Code Online (Sandbox Code Playgroud)

你不想那样,是吗:-)

尝试,

setTimeout(() => resolve({ campaigns: testData, count: 1000 }), 5000)
Run Code Online (Sandbox Code Playgroud)

因为它将resolve调用包装在匿名函数中并将其作为第一个参数传递给setTimeout调用。