2013-03-01 9 views
6

共有サンプルを抽出してジャスミンテストをDRYしようとしています。jasmineの共有仕様coffeescriptのスコープの問題

@sharedExamplesForThing = (thing) -> 
    beforeEach -> 
    @thingy = new thing 

    it "is neat", -> 
    expect(@thingy.neat).toBeTruthy() 


describe "widget with shared behavior", -> 
    sharedExamplesForThing(-> new Widget) 

これは、すべてが1つのファイルで定義されている場合にうまく機能します。私が遭遇している問題はsharedExamplesを別のファイルに移動しようとするときに発生します。私はCan't find variable: sharedExamplesForThing ...

だから、デバッグの利益のために、私は次のことを試してみました取得:

describe "widget with shared behavior", -> 
    it "is acting like a meany", -> 
    console.log sharedExamplesForThing 
    expect(false).toBeTruthy() 
    sharedExamplesForThing(-> new Widget) 

is acting like a meanyブロックでは、ログは[Function]としてsharedExamplesForThing示していますが、私はまだitCan't find variableを取得します。これが私の現在の経験の範囲外の問題に関連するかもしれないような気がしますが、私はそれについて完全に間違っている可能性があります。私はここで何が欠けていますか?あなたはそれがグローバルオブジェクト(ブラウザでwindow)のプロパティとして割り当てられているのCoffeeScriptのトップレベルのメンバ変数を割り当てる場合

答えて

1

(レール、jasminerice、ガードジャスミンを使用して)

window.sharedExamplesForThing = ...; 

あなたがwindow.sharedExamplesForThingまたはちょうどsharedExamplesForThingとしてファイルの外にそれを参照できることを意味します。だから、次のJavaScriptを生成します。だからあなたがやっていることは、共有されたサンプルファイルがspecファイルの前にロードされていると仮定して動作するはずです。あなたが持っている問題は、specファイルが最初に読み込まれるということだと思います。なぜなら、記述関数はファイルがロードされるときに実行されるのに対し、関数はすべてのファイルがロードされた後に実行されるからです。したがって、ロード順を調整する必要がある場合は、共有サンプルファイルをsupportディレクトリに入れてから、これを最初に要求することができます。

ではなく、ウィンドウオブジェクトに直接変数を割り当てることが(あなたがグローバルオブジェクトを乱雑にしないように)にあなたの共有変数をエクスポートするための名前空間を設定する方が良い場合があります。

window.MyNamespace = {} 

MyNamespace.sharedExamplesForThing = ... 

その後であなたの仕様ファイルにはMyNamespace.sharedExamplesForThingという名前が付けられています。

私は、生成されたJavaScriptを見て、CoffeeScriptがファイル間で変数をどのようにエクスポートするかを理解することが役に立ちます。

0

ここでは共有例をどのように行うのがよいかについて私が書いたブログ記事です。お役に立てれば。

http://pivotallabs.com/drying-up-jasmine-specs-with-shared-behavior/

+0

あなたのブログの記事は非常に不完全です。最初に、あなたがそこで話している 'sharedBehaviorForGameOf'を見逃しています。そして、私はあなたのものをほぼ100%複製したテスト仕様ファイルを持っています。正確な階層であっても、' it() 'ブロック'describe()'ブロックは、私の "共有"変数は私の最初のテストでしか見えず、最初のテストの下の他のテストでは参照できません。私はあなたの記事を完成させ、共通のvars /関数についていくつかのヒントを与えるなら、私のような人々はほっとすると思います。それに、あなたは図書館で素晴らしい仕事をしてくれました。私はそれを愛しています。 – dimitarvp

+0

実際の(嘲笑されていない)AJAX呼び出しの結果を消費する 'runs()'ブロックで共有変数を使用しようとしています。明らかにバニラの例がかなりうまく機能するので、おそらくそれはスコープ上の問題です。 – dimitarvp

2

私はshared examples from thoughtbotの作品は本当に重宝。

次のように私はのCoffeeScript でそれを実装:

1)すべてのスペックファイルの前にロードされているいくつかのヘルパーファイルで:

window.FooSpec = 
    sharedExamples: {} 

window.itShouldBehaveLike = (-> 
    exampleName  = _.first(arguments) 
    exampleArguments = 
    _.select(_.rest(arguments), ((arg) => return !_.isFunction(arg))) 
    innerBlock  = _.detect(arguments, ((arg) => return _.isFunction(arg))) 
    exampleGroup  = FooSpec.sharedExamples[exampleName] 

    if(exampleGroup) 
    return describe(exampleName, (-> 
     exampleGroup.apply(this, exampleArguments) 
     if(innerBlock) then innerBlock() 
    ) 
    ) 
    else 
    return it("cannot find shared behavior: '" + exampleName + "'", (-> 
     expect(false).toEqual(true) 
    ) 
    ) 
) 

2)私のスペックの場合:

( a)私は共有行動を定義できます:

FooSpec.sharedExamples["had a good day"] = (-> 
    it "finds good code examples", -> 
     expect(this.thoughtbot_spy).toHaveBeenCalled() 
) 
itShouldBehaveLike("had a good day") 

:は、(B)、およびとして、いくつかの仕様でどこでもそれを使用する(注:私はスペックがそれに応じて上記の行の前this.thoughtbot_spyを定義していると仮定しています)

関連する問題