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

标签 node.js mocha.js proxyquire

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

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

测试:

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

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

更新。

这正在工作:

setTimeout(() => resolve({campaigns: mockedCampaigns, count: 1000}), 2000)

这是我最后的好方法:

// helper to wrap timeout generation
const timer = (data, time) =>
    new Promise((resolve, reject) =>
        setTimeout(() => resolve(data), time)
    );

// Factory function to generate mock with data we need
const blacklistedModelMockFactory =
    (onRead = [], onUpdate = 'Ok', onCreate = 'Ok', onDelete = 'Ok') => ({
        '../services/campaigns-blacklist.model': {
            read: () => timer(onRead, 2000),
            update: () => timer(onUpdate, 2000),
            create: () => timer(onCreate, 1000),
            delete: () => timer(onDelete, 1000),
        },
    });

// Test example
it('should filter Registered and Blacklisted collections', async function () {
    this.timeout(60000);
    $service.should.have.property('filterRB').a('function');
    const sourceRegistered = mockedCampaigns.slice(5, 10);
    const sourceBlacklisted = mockedCampaigns.slice(15, 18);
    let error, success;
    // mock dependencies in tested module with our expected data:
    let $serviceStubbed = proxyquire(
        '../services/campaign-sync', Object.assign(
            {},
            blacklistedModelMockFactory(sourceBlacklisted),
            registeredModelMockFactory(sourceRegistered)
        )
    );
    [error, success] = await to($serviceStubbed.filterRB(mockedCampaigns));
    expect(error).to.be.equal(null);
    success.filtered.length.should.be.equal(12);
    success.blacklisted.length.should.be.equal(3);
    success.registered.length.should.be.equal(5);
});

最佳答案

setTimeout(resolve({campaigns: testData, count: 1000}), 5000)

上面的线路调用流程可以解释如下。

let res = resolve({campaigns: testData, count: 1000});
setTimeout(res, 5000);

你不希望这样,是吗:-)

尝试,

setTimeout(() => resolve({ campaigns: testData, count: 1000 }), 5000)

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

关于node.js - 如何使用proxyquire和mocha在单元测试中模拟方法调用时模拟时间延迟(超时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48823073/

相关文章:

unit-testing - 如何在 react 组件的子组件中模拟 e.preventDefault

node.js - 如何使用JWT和Passport正确使用nodeJs API的身份验证?

javascript - 由于绝对路径, Mocha 不断轰炸

node.js - Azure Web 应用程序 + Node.js + Azure AD = 错误 431

javascript - Mocha 中的回调在哪里以及如何定义?

javascript - 测试 Node 快速端点和 stub 第 3 方 api 调用

node.js - Node 单元测试 - TypeError : Cannot read property 'order' of undefined

javascript - Node.js - 对内部带有模拟 promise 的函数进行单元测试

javascript - Node.js 使用 Socket.io 和 Http 从 Express 读取发布数据

node.js - gulp 无法识别导入关键字,抛出 SyntaxError : Unexpected reserved word