2012-12-10 3 views
12

Also, das war ein ziemlich interessantes Problem, auf das ich gestoßen bin.undefined | 0 | ReferenceError: Der strikte Modus verbietet die implizite Erstellung der globalen Eigenschaft 'csrf_token'

Ich baue gerade eine backbone.js - Rails App. In der Regel nur für Lernzwecke zu bauen. Ich bin (wie jeder gute Rails-Entwickler) bei TDD/BDD mein Bestes geben und stieß auf ein Problem mit Capybara.

Ich habe eine Integrationsspezifikation, die nur root_path testet (Backbone-Verlauf startet, zeigt erste Informationen, etc ...).

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 

Ich führe Tests mit Jasmin, Sinon und Capybara/rspec/webkit durch. Ich folge sowohl dem Buch "Rspec on Rails" von thoughtbot (ein tolles Buch übrigens) als auch diesem Tutorial: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html.

Wenn die oben spec laufen, stieß ich auf diesen Fehler:

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

Ich habe eine lange Zeit, dieses heraus Sortierung, da Google-able für diesen Fehler wirklich nichts ist.

Schließlich stolperte ich über die Verwendung von "Use Strict-Modus" in JS. Im Wesentlichen wird dies einige neue EMCA5-Skriptkonventionen verwenden. Es fängt mehr Codierungs-Blooper ab und verhindert den Zugriff auf globale Variablen. Alle guten Dinge.

So prüfe ich, und in meiner sinon.js Datei, ich sehe:

"use strict"; 

auf der Leitung 36 der Datei. Und siehe da, ich sage die Zeile aus, und meine Tests funktionieren gut.

Hier ist meine Frage: Warum strikt csrf Unordnung verwendet? Ich nehme an, das hat etwas mit csrf_meta_tags in meinem Rails-Layout zu tun. Wenn möglich, möchte ich diese Zeile zurück in Sinon js setzen, da ich davon ausgehe, dass es das "Richtige zu tun" ist

Hat jemand mehr Informationen dazu? Ich freue mich über alle Details im Voraus!

Antwort

21

Es teilt Ihnen mit, dass der Variablen csrf_token ein Wert zugewiesen wird, der nicht deklariert wurde, z.

csrf_token = 'foo'; 

In nicht-Strict-Modus, die eine Eigenschaft des globalen Objekts erstellen (in der Regel eine globale Variable genannt) genannt csrf_token, wenn diese Codezeile ausgeführt wird.

Im strikten Modus wird der angezeigte Fehler ausgegeben, da der strikte Modus die implizite Erstellung globaler Variablen verhindert. Man könnte es auch beheben, indem:

var csrf_token; 

überall in einem globalen Kontext im selben Skript Elemente wie der Code der Fehler herkommt, oder ein anderen Skript-Element.

Verwandte Themen