这个问题特别是因为我使用gon
,但从概念上讲它可以适用于其他情况,所以我试图扩大它。 Gon是一个漂亮的宝石,允许您在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
文件中更改不同规格的虚拟变量......
通过最后一句话,我的意思是我一直在进行故障排除,并发现在灯具或spec文件本身中声明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>
这让我回到了我的问题。我的调试显然显示jasmine.yml
中的JS文件是在fixtures或spec文件(及其之前的操作)之前加载的。因此,如何在jasmine.yml
中的JS文件之前加载动态代码?有没有我可以使用的助手或......?请记住,这一点的重点在于我想根据规范更改我在JS文件之前加载的代码。即,有时我希望gon.this = "that"
,但有时我想gon.this = "those"