6

共有例を抽出して、ジャスミンテストを乾かそうとしています。

@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ブロック内では、ログはsharedExamplesForThingとして表示されますが、[Function]それでも。のCan't find variable外側が表示されますit。これは私の現在の経験以外のスコーピングの問題と関係があるように感じますが、それについては完全に間違っている可能性があります。ここで何が欠けていますか?

(レール、ジャスミネリス、ガードジャスミンを使用)

4

3 に答える 3

2

思考ボットから共有された例に関する記事は本当に役に立ちました。

次のように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()
)

(b) そして、仕様のどこでも次のように使用します。

itShouldBehaveLike("had a good day")

(注:仕様がthis.thoughtbot_spy上記の行の前にそれに応じて定義されていると想定しています)

于 2013-04-28T00:39:32.737 に答える
1

CoffeeScript でトップレベルのメンバー変数を割り当てると、グローバル オブジェクトのプロパティとして割り当てられます (windowブラウザ内)。したがって、次の JavaScript が生成されます。

window.sharedExamplesForThing = ...;

window.sharedExamplesForThingつまり、ファイルの外部で、または単にとして参照できることを意味しますsharedExamplesForThing。したがって、共有されたサンプル ファイルがスペック ファイルの前にロードされていると仮定すると、あなたがしていることはうまくいくはずです。あなたが抱えている問題は、スペックファイルが最初にロードされることだと思います(すべてのファイルがロードされた後に関数が実行されるのに対し、ファイルがロードされると記述関数が実行されるため)。そのため、読み込み順序を調整する必要がある場合があります。共有サンプル ファイルをsupportディレクトリに配置してから、最初にこれを要求することができます。

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

window.MyNamespace = {}

MyNamespace.sharedExamplesForThing = ...

次に、spec ファイルで、それを として参照できますMyNamespace.sharedExamplesForThing

生成された JavaScript を調べて、CoffeeScript がファイル間で変数をエクスポートする方法を理解しようとすると役に立ちます。

于 2013-03-01T19:59:09.127 に答える
0

これは、共有された例を実行する最善の方法について書いたブログ投稿です。お役に立てれば。

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

于 2013-03-05T19:07:05.413 に答える