如何在javascript

时间:2018-08-24 11:43:42

标签: javascript mocha setinterval

您好,我正在编写此功能的单元测试用例。当我从单元测试用例运行此函数时,它涵盖了所有语句,但没有涵盖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);
    });
});

3 个答案:

答案 0 :(得分:2)

首先,如果要重试失败的任务,则永远不要使用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);
});

答案 1 :(得分:1)

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

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

  

假计时器是setTimeout和friends的同步实现   Sinon.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");
  });
});

答案 2 :(得分:0)

只需包装到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)
});