使用javascript全局窗口变量和集成测试

时间:2014-01-02 19:13:01

标签: ruby-on-rails capybara phantomjs poltergeist

nifty stackoverflow post传递给Javascript。它回应了railscast episode。该技术就像配置jquery datepicker的魅力一样,但会导致我的所有javascript集成测试失败。

以下是application.html.erb

中的代码
<script type="text/javascript">
<%-# commented line -%>
  window.sDateFormatLocal = "<%= t 'date.formats.js_date' %>"
</script>

这是一个使用它的日期选择器初始化

  $("input.datepicker").datepicker({
    dateFormat: sDateFormatLocal,
    onClose: function(value, ui) {
     console.log("regular old datepicker");
    }
  }

它似乎运作良好。唯一的问题是,我使用'js:true'进行的所有集成测试现在都失败了。这是我得到的错误。

  

水豚::鬼驱:: JavascriptError:          页面上的Javascript代码中出现了一个或多个错误:

   ReferenceError: Can't find variable: sDateFormatLocal

当我在浏览器(Chrome,Firefox)中运行时,控制台中没有错误或警告。

为了完整起见,典型的规范如下:

  describe "The root" do
    it "should load the page and have js working.", :js => true do
      visit root_path
      page.should have_content "Hello world"
    end
  end

我是否缺少允许在poltergeist中使用此类变量的设置?

2 个答案:

答案 0 :(得分:1)

如果您的datepicker函数不在jQuery文档就绪函数或类似方法(如window.onload)中,那么您将遇到麻烦。

默认情况下,application.js将在head中加载,而后来的html.erb中的JS代码。 html和资产由浏览器并行加载,很可能资产最初会完成加载。如果您立即执行该功能而不是等待文档就绪,则该变量未定义。

如果您错过了,请将此类代码放入就绪块。

导出服务器变量的一个更好的做法是,而不是将它放在html体中,在application.js之前把它放在头上,这样你就不会对未定义的变量有任何问题。

答案 1 :(得分:0)

只是对此进行跟进,以防有人在调试类似的问题。事实证明,在这种情况下,并非每个视图都使用相同的模板。例如,登录屏幕具有不同的头部。这导致这种情况在某些情况下不会加载,而不是其他情况,例如我的测试失败的情况。最重要的是,确保在复制测试时,您完全按照测试的方式进行,就像我的情况一样,通过登录屏幕。