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

问题描述 投票:1回答:1

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

我有98%的解决方案,基于this answer,但基于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...`)

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

javascript mocha sinon
1个回答
0
投票

更新:在一夜好眠之后,我设法解决了这个问题并实现了我的目标:

testContext = {
  currentTest: this.currentTest
}

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

© www.soinside.com 2019 - 2024. All rights reserved.