2012-12-10 17 views
12

Quindi, questo è stato un problema piuttosto interessante in cui mi sono imbattuto.undefined | 0 | ReferenceError: la modalità Strict impedisce la creazione implicita della proprietà globale "csrf_token"

Attualmente sto costruendo un backbone.js - app Rails. Generalmente solo costruendo questo per scopi di apprendimento. Io sono (come qualsiasi buon dev rails) facendo del mio meglio con TDD/BDD e mi sono imbattuto in un problema con capibara.

Ho una specifica di integrazione che si limita a testare i lavori root_path (inizia la cronologia di backbone, visualizza le informazioni iniziali, ecc ...).

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 

Sono in esecuzione test con jasmine, sinon e capybara/rspec/webkit. Sto seguendo vagamente sia il libro "Rspec on Rails" di thoughtbot (fantastico libro tra l'altro), sia questo tutorial: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html.

Quando si esegue le specifiche di cui sopra, mi sono imbattuto in questo errore:

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

ho preso un lungo periodo di tempo l'ordinamento questo fuori perché non c'è davvero nulla di google-in grado per questo errore.

Eventualmente mi sono imbattuto in "use strict-mode" in JS. Essenzialmente questo utilizzerà alcune nuove convenzioni di script EMCA5. Catturerà più blooper di codice e ti impedirà di accedere alle variabili globali. Tutte cose buone.

Così ho controllare, e nel mio file sinon.js, vedo:

"use strict"; 

sulla linea 36 del file. Ecco perché commento la battuta, e i miei test funzionano bene.

Ecco la mia domanda: perché è stato utilizzato il csrf? Presumo che questo abbia qualcosa a che fare con csrf_meta_tags nel mio layout di rails. Se possibile, vorrei riassumere questa riga in sinon js poiché presumo che sia la "cosa giusta da fare"

Qualcuno ha ulteriori informazioni su questo? Apprezzo tutti i dettagli in anticipo !!

risposta

21

Si sta dicendo che un valore viene assegnato a una variabile denominata csrf_token che non è stata dichiarata, ad es.

csrf_token = 'foo'; 

In modalità non rigida, che creerà una proprietà dell'oggetto globale (di solito chiamato una variabile globale) chiamato csrf_token quando viene eseguita quella riga di codice.

In modalità rigorosa, genera l'errore visualizzato poiché la modalità rigorosa impedisce la creazione implicita di variabili globali. Si potrebbe anche risolvere il problema includendo:

var csrf_token; 

ovunque in un contesto globale nello stesso elemento script come il codice di errore viene, o un elemento di script precedente.

Problemi correlati