所以,这是我一直遇到的一个非常有趣的问题。
我目前正在构建一个 backbone.js - Rails 应用程序。通常只是为了学习目的而构建它。我(就像任何优秀的 Rails 开发人员一样)在 TDD/BDD 方面尽力而为,但我遇到了 capybara 的问题。
我有一个仅测试 root_path 工作的集成规范(主干历史开始、显示初始信息等...)。
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 运行测试。我松散地遵循了 thoughtbot 的“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'
我花了很长时间才解决这个问题,因为这个错误真的没有什么可以用谷歌搜索的。
最终我偶然发现在 JS 中使用“使用严格模式”。本质上,这将使用一些新的 EMCA5 脚本约定。它会捕获更多的编码漏洞,并阻止您访问全局变量。所有美好的事物。
所以我检查了一下,在我的 sinon.js 文件中,我看到:
"use strict";
在文件的第 36 行。瞧,我注释掉了这一行,我的测试工作正常。
这是我的问题:为什么 use strict 弄乱了 csrf?我假设这与我的 Rails 布局中的 csrf_meta_tags 有关。如果可能的话,我想把这条线放回 sinon js 中,因为我认为这是“正确的做法”
有人有这方面的更多信息吗?我提前感谢任何细节!
最佳答案
它告诉您一个值被分配给一个名为 csrf_token 的变量,该变量尚未声明,例如
csrf_token = 'foo';
在非严格模式下,当执行该行代码时,将创建名为 csrf_token 的全局对象(通常称为全局变量)的属性。
在严格模式下,它会抛出您看到的错误,因为严格模式会阻止隐式创建全局变量。您还可以通过包括以下内容来修复它:
var csrf_token;
全局上下文中与错误来源代码或先前脚本元素相同的脚本元素中的任何位置。
关于javascript - 未定义|0|引用错误 : Strict mode forbids implicit creation of global property 'csrf_token' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13794637/