我正在使用mochawesome测试报告程序进行我的摩卡测试。我希望它也记录我的日志记录,并将其附加到编写日志时正在运行的任何测试中。这可以通过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
具有两个属性: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...`)
干杯!希望我提供了足够的信息而不会太冗长...
答案 0 :(得分:0)
更新:经过一夜安眠,我设法解决了这个问题并实现了我所追求的目标:
testContext = {
currentTest: this.currentTest
}
现在,即使beforeEach()
丢失了对currentTest的引用(仍然不确定为什么会发生),仍然保留该引用。