这个问题特别是因为我正在使用gon
,但从概念上讲它可以适用于其他情况,所以我试图扩大一点。Gon 是一个漂亮的 gem,它允许你在 Rails 控制器中声明一个变量,然后在你的 Javascript 中使用它。例如:
def index
gon.this = "that"
end
// index.html
<script>
console.log(gon.this)
// would print "that"
</script>
具体来说,这是如何发生的,Gon 注入了一段声明全局变量的脚本,如下所示:
<script>
window.gon = {}
gon.this = "that"
</script>
我使用 Jasmine 测试的代码如下所示:
// test.js
function loadProperPage() {
if (gon.this == "that") {
...
} else {
...
}
}
如您所见,gon
立即使用!我的问题是 Jasmine 一直说gon
尚未定义,所以我不确定如何以语义上合理的方式“注入”它。我能想到的唯一方法是在加载我正在测试的文件之前创建一个假.js
文件并在我的文件中将其作为源文件。javascript.yml
即,它看起来像这样:
src_files:
- assets/gon_variables.js
- assets/test.js
但这不是一个可持续的解决方案,因为那样我就无法gon_variables.js
针对不同的规格更改文件中的虚拟变量......
通过最后一句话,我的意思是我一直在进行故障排除,并发gon
现在夹具或规范文件本身中声明变量将不起作用。即以下两个都不能解决问题
/////// spec file approach
//spec file
describe...
beforeEach(function() {
gon.this = "that"
})
})
/////// fixture file approach
// spec file
describe...
beforeEach(function() {
loadFixtures('test.html')
})
})
// test.html fixture
<head>
<script>
var gon = {permission: "new"}
</script>
</head>
<body>
...
</body>
这让我回到了我的问题。我的调试显然表明,其中的 JS 文件jasmine.yml
是在固定装置或规范文件(及其之前的操作)之前加载的。因此,你还能如何在 JS 文件之前加载动态代码jasmine.yml
?有没有我可以使用的助手或...?请记住,我想根据规范更改在 JS 文件之前加载的代码。即,有时我想拥有,gon.this = "that"
但有时我想要gon.this = "those"