繁体   English   中英

如何在JavaScript的单元测试用例中覆盖setInterval

[英]How to cover setInterval in the unit test case in javascript

嗨,我正在编写此功能的单元测试用例。 当我从单元测试用例运行此函数时,它涵盖了所有语句,但没有涵盖setInterval完整行。

有谁知道如何用javascript覆盖它? 我正在使用摩卡咖啡。

const open = async function (config) {

    ...... set of lines..

    let retryIn = setInterval(async () => {
        try {
            client = await connect(config);
            clearInterval(retryIn);
            return client;
        } catch (err) {
           //error
        }
    }, 20000);

};

我只是这样称呼它

it("###test", async () => {
        open(config);
    });
});

首先,如果要重试失败的任务,则永远不要使用setInterval 您应该改用setTimeout

除此之外,您无法从经典的回调基础函数(如setIntervalsetTimeout返回值。 因此,以当前形式,调用open时返回的promise将在建立任何连接之前得到解决。

使用await / async您可以为这种情况创建干净而简单的设置:

 function wait(seconds) { return new Promise((resolve, _) => setTimeout(resolve, seconds)) } async function connect() { throw new Error('failed') } async function open(config) { let client; while (client === undefined /* || retries > maxRetries*/ ) { try { client = await connect(config); } catch (err) { // if connection failed due to an error, wait n seconds and retry console.log('failed wait 2 seconds for reconnect'); await wait(2000) // ++retries } } if (!client) { throw new Error('connection failed due to max number of retries reached.') } return client } async function main() { let connection = await open() } main().catch(err => console.log(err)) 

您可以通过添加重试限制来进一步扩展此代码段。 有关如何实现的粗略想法,请参见评论。

要测试上面的代码,您可以编写:

it("###test", function() {
  return open(config);
});

有人发布了有关假计时器的答案,然后将其删除,答案是正确的,因此我再次发布了。

您可以使用sinonjs创建假计时器

虚假计时器是setTimeout和好友的同步实现,Sinn.JS可以使用它们来覆盖全局函数,从而使您可以更轻松地使用它们测试代码

但是从您的代码看来,您似乎正在尝试在异步代码中测试异步代码,可以像这样实现

describe('somthing', () => {
  it('the result is 2', async () => {
    const x = await add(1, 1)
    expect(x).to.equal(4);
  });
});

与您的代码更接近

async function open() {

  return new Promise((resolve, reject) => {

    setTimeout(() => {
      resolve('done')
    }, 1000);
  });
};

describe('somthing', () => {
  it('###test', async () => {
    const x = await open()
    chai.expect(x).to.equal("done");
  });
});

只是包装到Promise

const open = async function (config) {
    ...... set of lines..
    return new Promise((resolve, reject) => {
      let retryIn = setInterval(async () => {
        client = await connect(asConfigParam);
        clearInterval(retryIn);
        return client;
      }, 20000);
      return resolve(retryIn);
    });
};


it("###test", async () => {
        const result = await open(config);
        console.log('result', result)
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM