2012-12-10 7 views
12

To był dość interesujący problem, na który natknąłem się.undefined | 0 | ReferenceError: Tryb ścisły zabrania niejawnego tworzenia właściwości globalnej "csrf_token"

Aktualnie buduję backbone.js - aplikację Rails. Generalnie po prostu buduję to dla celów edukacyjnych. Jestem (jak każdy dobry dev) grając najlepiej w TDD/BDD i wpadłem na problem z kapibarą.

Mam specyfikację integracji, które po prostu testuje root_path działa (rozpoczyna historię szkieletu, wyświetla informacje początkowe, itp ...).

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 

Prowadzę testy z użyciem jaśminu, sinona i kapibara/rspec/webkit. Mam luźne śledzenie zarówno książki "Rspec on Rails" autorstwa thinkbota (niesamowita książka przy okazji), i tego samouczka: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html.

Uruchamiając powyższą specyfikację, natknąłem się na ten błąd:

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

Wziąłem długi czas sortowania na to uwagę, ponieważ nie ma naprawdę nic google-stanie tego błędu.

W końcu natknąłem się na używanie "użyj trybu ścisłego" w JS. Zasadniczo użyje to nowych konwencji skryptowych EMCA5. Spowoduje to przechwycenie kolejnych przechwytujących kodowania i uniemożliwi dostęp do zmiennych globalnych. Wszystkie dobre rzeczy.

więc sprawdzić, aw moim sinon.js pliku, widzę:

"use strict"; 

na linii 36 pliku. Lo i oto komentuję linię, a moje testy działają dobrze.

Oto moje pytanie: Dlaczego użyłem ścisłego bałaganu csrf? Zakładam, że ma to coś wspólnego z csrf_meta_tags w moim układzie szyn. Jeśli to możliwe chciałbym umieścić tę linię z powrotem w sinon js jak zakładam jej na „słuszne”

Czy ktoś ma więcej informacji na ten temat? Doceniam wszelkie szczegóły z góry !!

Odpowiedz

21

jest informacją, że wartość jest przypisana do zmiennej o nazwie csrf_token który nie został uznany, na przykład

csrf_token = 'foo'; 

w trybie non-ścisłym, które stworzą własność globalnego obiektu (zwykle o nazwie zmienna globalna) nazywa csrf_token kiedy to linia kodu jest wykonywany.

W trybie ścisłym, będzie rzucać się błąd widoczny ponieważ tryb ścisły zapobiega niejawny tworzenie zmiennych globalnych. Można również ustalić ją w tym:

var csrf_token; 

nigdzie w kontekście globalnym, w tym samym elemencie skryptu jako kod błędu pochodzi, lub poprzedniego elementu skryptu.

Powiązane problemy