当前位置: 代码迷 >> JavaScript >> 将上下文传递给Sinon存根的假函数
  详细解决方案

将上下文传递给Sinon存根的假函数

热度:83   发布时间:2023-06-07 15:52:17.0

我正在使用测试报告程序进行我的Mocha测试。 我希望它也记录我的日志记录,并将其附加到编写日志时正在运行的任何测试中。 这可以通过addContext()实现。 但是,我希望将日志输出到控制台,因此我可以在测试运行时对其进行监视,而不必等到所有步骤完成并生成报告。

基于 ,我已经有了98%的解决方案,但是基于mochawesome的addContext()要求您将其传递给测试对象这一事实,我感到很苦恼。 这是我得到的:

 beforeEach(`Spy on logger`, function() { const origLogInfo = logger.info.bind(logger), origLogError = logger.error.bind(logger), testContext = this sinon.stub(logger, 'info').callsFake(function(message) { addContext(testContext, `INFO: ${message}`) origLogInfo.call(testContext, message) }) sinon.stub(logger, 'error').callsFake(function(message) { addContext(testContext, `ERROR: ${message}`) origLogError.call(testContext, message) }) }) afterEach(`Remove stubs`, function() { logger.info.restore() logger.error.restore() }) it('counts approved hours', async function() { logger.info(`Approving timesheets...`) ... 

因此,在每个it()之前,我都获得了对原始logger.info()logger.error()函数的引用,然后对它们进行了存根。 存根调用一个函数,该函数调用mochawesome的addContext()函数,并将其传递给beforeEach()以及我发送给logger.info()任何字符串的引用。 然后调用原始文件。

我的问题是每次调用addContext() ,它会将日志附加到beforeEach()钩子上。 我也明白为什么会这样。 beforeEach()检查代码可以发现,在执行beforeEach()时, this具有两个属性: currentTesttest 前者是指将要被调用的it() ,后者是beforeEach()钩子本身。 这很棒! 如果它保持这种状态,则addContext()将选择currentTest并将日志附加到它( )。

但是,到调用callsFake()的参数时,该对象已失去其currentTest属性,因此addContext()会将日志附加到beforeEach()钩子本身。 生成一个测试报告,其中所有日志都附加到beforeEach挂钩上,而不是相关的测试。

有什么办法可以编写此代码,以便callsFake()参数引用调用logger.info的测试? 以下工作,但在每个it()需要额外的代码:

 boundLoggerInfo = logger.info.bind(this); boundLoggerInfo(`Approving timesheets...`) 

干杯! 希望我提供了足够的信息而不会冗长...

更新:经过一夜的睡眠,我设法解决了这个问题并实现了我所追求的目标:

 testContext = { currentTest: this.currentTest } 

现在,即使在beforeEach()丢失了currentTest之后,仍然维护了对currentTest的引用(仍然不确定为什么会这样)。

  相关解决方案