问题描述
我正在使用测试报告程序进行我的Mocha测试。
我希望它也记录我的日志记录,并将其附加到编写日志时正在运行的任何测试中。
这可以通过addContext()
实现。
但是,我还希望将日志输出到控制台,因此我可以在测试运行时对其进行监视,而不必等到所有步骤完成并生成报告。
基于 ,我已经有了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()
检查代码可以发现,在执行beforeEach()
时, this
具有两个属性: currentTest
和test
。
前者是指将要被调用的it()
,后者是beforeEach()
钩子本身。
这很棒!
如果它保持这种状态,则addContext()
将选择currentTest
并将日志附加到它( )。
但是,到调用callsFake()
的参数时,该对象已失去其currentTest
属性,因此addContext()
会将日志附加到beforeEach()
钩子本身。
生成一个测试报告,其中所有日志都附加到beforeEach
挂钩上,而不是相关的测试。
有什么办法可以编写此代码,以便callsFake()
参数引用调用logger.info
的测试?
以下工作,但在每个it()
需要额外的代码:
boundLoggerInfo = logger.info.bind(this); boundLoggerInfo(`Approving timesheets...`)
干杯! 希望我提供了足够的信息而不会太冗长...
1楼
更新:经过一夜的睡眠,我设法解决了这个问题并实现了我所追求的目标:
testContext = { currentTest: this.currentTest }
现在,即使在beforeEach()
丢失了currentTest之后,仍然维护了对currentTest的引用(仍然不确定为什么会这样)。