我正在为使用Gatsby
构建的客户网站编写单元测试。我需要能够提供100%的覆盖率。我无法对源代码进行重大修改,因为我没有构建网站,也不拥有代码,以免冒着破坏UI的风险(我不进行快照或UI测试)。
我一直在Github问题,堆栈溢出等问题中寻找答案,而且似乎在使用/* istanbul ignore next */
时经常出现特殊情况。
使用Gatsby时,您必须检查所有脚本或Web API对window
的引用,如果是typeof window === 'undefined'
,则必须有条件地忽略该代码,因为Gatsby是在服务器上静态生成站点的。为了增加对这些语句,分支,函数和行的覆盖范围,我已经能够使用/* istanbul ignore next */
。但是,我在使用特定的类组件时遇到了麻烦。
我尝试在生命周期内/* istanbul ignore next */
块之前的componentDidmount
和componentDidUpdate
之前,在函数名称和括号之间的生命周期定义中使用if
。我也尝试过使用/* istanbul ignore if */
。
无论我使用什么代码,我都无法覆盖。我愿意接受这里的任何建议,无论是使用ignore
语句的更好方法,还是有关创建可实现此目的的测试的提示。谢谢您的帮助!
以下是该组件无法发现的行(到目前为止):
careers.js
componentDidmount() {
this.context.setHeaderTheme(`bright`)
/* istanbul ignore next */
if (typeof window !== `undefined` && typeof document !== `undefined`) {
if (!window.Grnhse) {
const script = document.createElement(`script`)
script.setattribute(
`src`,`<hidden/path/for/security/purposes>`
)
script.setattribute(`width`,`100%`)
script.onload = () => window.Grnhse && window.Grnhse.Iframe.load()
document.body.appendChild(script)
} else {
if (window.Grnhse) {
window.Grnhse.Iframe.load()
}
}
}
}
componentDidUpdate() {
/* istanbul ignore next */
if (
!this.scrollDone &&
typeof window !== `undefined` &&
window.location.search.includes(`gh_jid`) &&
this.greenhouseContainer
) {
this.scrollDone = true
window.scrollTo({
top: this.greenhouseContainer.offsetTop,behavior: `smooth`,})
}
}