我正在使用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
有两个属性: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...`)
干杯!希望我提供足够的信息,而不是太冗长...
更新:在一夜好眠之后,我设法解决了这个问题并实现了我的目标:
testContext = {
currentTest: this.currentTest
}
现在即使在beforeEach()
失去它之后仍然保持对currentTest的引用(仍然不确定为什么会发生这种情况)。