javascript - 将上下文传递给 Sinon 存根的假函数
问题描述
我正在使用mochawesome测试报告器进行 mocha 测试。我还希望它记录我的日志记录,并将其附加到写入日志时正在运行的任何测试中。这可以通过addContext()
. 但是,我还希望将日志输出到控制台,这样我就可以在测试运行时监控它们,而不是等到它全部完成并生成报告。
基于这个答案,我有 98% 的解决方案,但是基于 mochawesomeaddContext()
要求您通过测试对象这一事实而苦苦挣扎。这是我所拥有的:
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...`)
...
因此,在 each 之前it()
,我得到对原始logger.info()
和logger.error()
函数的引用,然后对它们进行存根。存根调用一个函数,该函数调用 mochawesome 的addContext()
函数,将它的引用传递给beforeEach()
我发送到的 和任何字符串logger.info()
。然后调用原件。
我的问题是每次addContext()
调用时,它都会将日志附加到beforeEach()
钩子上。我也明白为什么会这样。单步执行代码会发现 whenbeforeEach()
正在执行,this
有两个属性:currentTest
和test
。前者是指it()
即将被调用的,后者是beforeEach()
钩子本身。这很棒!如果它保持这样,addContext()
将拾取currentTest
并将日志附加到它(链接到源)。
然而,当参数 tocallsFake()
被调用时,同一个对象已经失去了它的currentTest
属性,所以addContext()
改为将日志附加到beforeEach()
钩子本身。导致生成包含所有日志的测试报告,beforeEach
而不是相关测试。
有什么办法可以写这个,所以callsFake()
参数引用了logger.info
被调用的测试?以下工作,但需要在每个额外的代码it()
:
boundLoggerInfo = logger.info.bind(this);
boundLoggerInfo(`Approving timesheets...`)
干杯! 希望我已经提供了足够的信息而不会太冗长......
解决方案
更新:经过一夜安眠后,我设法解决了这个问题并实现了我所追求的目标:
testContext = {
currentTest: this.currentTest
}
现在,即使在beforeEach()
丢失它之后仍然保留对 currentTest 的引用(仍然不确定为什么会发生这种情况)。
推荐阅读
- python - driver.find_elements_by_xpath 只搜索一个类
- javascript - 在 ReactJS 中从 Firebase 下载多个文件
- windows - 将多个 PNG 图标转换为一个 .ICO 图标
- python - 按钮未在主图像显示器中设置图像单击 kivy 中的图像按钮
- python - 我想通过 Python 中的列表 Comprehensions 列出字典中的所有键
- wordpress - Traefik 2 可以路由到 VPS 上的内部 docker 容器和完全外部的域吗?
- python - 在一行(行)中从左到右排序轮廓,然后在第二行从左到右排序
- c# - 如何在 ASP.net 核心运行时更新 HttpClient 基地址
- javascript - 设置焦点后如何让光标进入输入框?
- slack - 使用 Slack API 向 Slack 上的任何用户发送消息