undefined | 0 | ReferenceError:严格模式禁止隐式创建全局属性' csrf_token'

时间:2012-12-10 03:34:00

标签: javascript ruby-on-rails backbone.js jasmine sinon

所以,这是我遇到的一个非常有趣的问题。

我目前正在构建一个backbone.js - Rails应用程序。通常只是为了学习目的而构建它。我(就像任何好的rails dev)在TDD / BDD上做得最好,我遇到了水豚问题。

我有一个仅仅测试root_path工作的集成规范(Backbone历史记录启动,显示初始信息等等)。

require 'spec_helper'

describe "RentalProperties", js: true do
  describe "GET /" do
    it "should show a list of properties" do
      visit root_path
      eventually{page.should have_content("Something")}
    end
  end
end

我正在使用jasmine,sinon和capybara / rspec / webkit运行测试。我正在松散地遵循thinkbot的“Rspec on Rails”一书(顺便说一句很棒的书)和本教程:http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html

运行上述规范时,我遇到了这个错误:

undefined|0|ReferenceError: Strict mode forbids implicit creation of global property 'csrf_token'

我花了很长时间对其进行整理,因为这个错误确实没有google-able。

最终我偶然发现在JS中使用“use strict-mode”。本质上,这将使用一些新的EMCA5脚本约定。它将捕获更多编码bloopers,并使您无法访问全局变量。所有好事。

所以我检查一下,在我的sinon.js文件中,我看到了:

"use strict";

在文件的第36行。瞧,我注意了这一行,我的测试工作正常。

这是我的问题:为什么使用严格搞乱csrf?我假设这与我的rails布局中的csrf_meta_tags有关。如果可能的话,我想把这条线放回到sinon js中,因为我认为它是“正确的事情”

有没有人有更多相关信息?我提前感谢任何细节!!

1 个答案:

答案 0 :(得分:22)

它告诉您正在为尚未声明的名为csrf_token的变量分配值,例如

csrf_token = 'foo';

在非严格模式下,当执行该行代码时,将创建名为csrf_token的全局对象(通常称为全局变量)的属性。

在严格模式下,它会抛出您看到的错误,因为严格模式会阻止隐式创建全局变量。你也可以通过包括:

来解决它
var csrf_token;

全局上下文中与错误来源的代码相同的脚本元素中的任何位置,或前一个脚本元素。