首页 > 解决方案 > 将上下文传递给 Sinon 存根的假函数

问题描述

我正在使用mochawesome测试报告器进行 mocha 测试。我还希望它记录我的日志记录,并将其附加到写入日志时正在运行的任何测试中。这可以通过addContext(). 但是,我希望将日志输出到控制台,这样我就可以在测试运行时监控它们,而不是等到它全部完成并生成报告。

基于这个答案,我有 98% 的解决方案,但是基于 mochawesomeaddContext()要求您通过测试对象这一事实而苦苦挣扎。这是我所拥有的:

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...`)
        ...

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

我的问题是每次addContext()调用时,它都会将日志附加到beforeEach()钩子上。我也明白为什么会这样。单步执行代码会发现 whenbeforeEach()正在执行,this有两个属性:currentTesttest。前者是指it()即将被调用的,后者是beforeEach()钩子本身。这很棒!如果它保持这样,addContext()将拾取currentTest并将日志附加到它(链接到源)。

然而,当参数 tocallsFake()被调用时,同一个对象已经失去了它的currentTest属性,所以addContext()改为将日志附加到beforeEach()钩子本身。导致生成包含所有日志的测试报告,beforeEach而不是相关测试。

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

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

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

标签: javascriptmocha.jssinon

解决方案


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

testContext = {
  currentTest: this.currentTest
}

现在,即使在beforeEach()丢失它之后仍然保留对 currentTest 的引用(仍然不确定为什么会发生这种情况)。


推荐阅读