将上下文传递给 Sinon 存根的假函数
Passing context to Sinon stub's fake function
我正在使用 mochawesome 测试报告器进行 mocha 测试。我希望它也能记录我的日志记录,并将其附加到写入日志时 运行 的任何测试。这可以通过 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()
hook本身。这很棒!如果它保持这样,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 的引用(仍然不确定为什么会这样)。
我正在使用 mochawesome 测试报告器进行 mocha 测试。我希望它也能记录我的日志记录,并将其附加到写入日志时 运行 的任何测试。这可以通过 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()
hook本身。这很棒!如果它保持这样,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 的引用(仍然不确定为什么会这样)。