【问题标题】:Passing context to Sinon stub's fake function将上下文传递给 Sinon 存根的假函数
【发布时间】:2019-03-04 06:07:44
【问题描述】:

我正在使用 mochawesome 测试报告器进行 mocha 测试。我还希望它记录我的日志记录,并将其附加到写入日志时正在运行的任何测试中。这可以通过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.js sinon


    【解决方案1】:

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

    testContext = {
      currentTest: this.currentTest
    }

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多