【发布时间】: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 有两个属性:currentTest 和test。前者指的是即将被调用的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