12

ですから、これは私が遭遇した非常に興味深い問題でした。

私は現在backbone.jsを構築しています-Railsアプリ。通常、これは学習目的で作成するだけです。私は(他の優れたRails開発者と同様に)TDD / BDDで最善を尽くしており、カピバラで問題が発生しました。

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

ジャスミン、シノン、カピバラ/ rspec/webkitでテストを実行しています。私はthoughtbotによる「RspeconRails」の本(ちなみに素晴らしい本)とこのチュートリアルの両方を大まかにフォローしています: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で「usestrict-mode」を使用していることに気づきました。基本的に、これはいくつかの新しいEMCA5スクリプト規則を使用します。より多くのコーディングNG集をキャッチし、グローバル変数にアクセスできなくなります。いいこと。

だから私はチェックします、そして私のsinon.jsファイルで、私は見ます:

"use strict";

ファイルの36行目。見よ、私はその行をコメントアウトし、私のテストはうまく機能している。

ここに私の質問があります:なぜ厳密な混乱csrfを使用したのですか?これは私のrailsレイアウトのcsrf_meta_tagsと関係があると思います。可能であれば、この行をsinon jsに戻したいと思います。これは、「正しいこと」だと思います。

誰かがこれについてもっと情報を持っていますか?よろしくお願いします!!

4

1 に答える 1

23

csrf_token宣言されていない変数に値が割り当てられていることを示しています。

csrf_token = 'foo';

非厳密モードでは、そのcsrf_tokenコード行が実行されたときに呼び出されるグローバル オブジェクト (通常はグローバル変数と呼ばれる) のプロパティが作成されます。

厳密モードでは、グローバル変数の暗黙的な作成が防止されるため、表示されるエラーがスローされます。以下を含めて修正することもできます。

var csrf_token;

エラーが発生したコードと同じスクリプト要素、または前のスクリプト要素のグローバル コンテキスト内の任意の場所。

于 2012-12-10T04:21:55.683 に答える