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

Passing context to Sinon stub's fake function

我正在使用 mochawesome 测试报告器进行 mocha 测试。我希望它也能记录我的日志记录,并将其附加到写入日志时 运行 的任何测试。这可以通过 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() hook本身。这很棒!如果它保持这样,addContext() 将选择 currentTest 并将日志附加到它 (link to source)。

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

有什么办法可以让 callsFake() 参数引用调用 logger.info 的测试吗?以下有效,但每个 it():

中都需要额外的代码

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

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

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

testContext = {
  currentTest: this.currentTest
}

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