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

时间:2019-03-04 06:07:45

标签: javascript mocha sinon

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

我已经基于this answer获得了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()时,this具有两个属性:currentTesttest。前者指的是it(),而钩子本身就是beforeEach()。这很棒!如果它保持这种状态,addContext()会拿起currentTest并将日志附加到它上(link to source)。

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

有什么我可以写的方式,以便callsFake()参数引用调用logger.info的测试吗?可以使用以下方法,但是每个it()内都需要额外的代码:

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

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

1 个答案:

答案 0 :(得分:0)

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

testContext = {
  currentTest: this.currentTest
}

现在,即使beforeEach()丢失了对currentTest的引用(仍然不确定为什么会发生),仍然保留该引用。