0

这个问题特别是因为我正在使用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"

4

0 回答 0