Jasmine与coffeescript分享了规范范围问题

时间:2013-03-01 16:07:31

标签: javascript coffeescript tdd jasmine

我试图通过提取共享示例来干掉一些茉莉花测试。

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

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


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

当在一个文件中定义所有内容时,这很有效。当我尝试将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。我觉得这可能与我目前的经验之外的范围问题有关,但我可能完全错了。我在这里缺少什么?

(使用rails,jasminerice,guard-jasmine)

3 个答案:

答案 0 :(得分:2)

我发现shared examples from thoughtbot上的这篇文章非常有用。

我在 coffeescript 中实现了它,如下所示:

1)在所有spec文件之前加载的一些帮助文件中:

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

答案 1 :(得分:1)

在CoffeeScript中分配顶级成员变量时,它被指定为全局对象的属性(浏览器中为window)。因此它生成以下JavaScript:

window.sharedExamplesForThing = ...;

这意味着您可以在文件外部将其引用为window.sharedExamplesForThing或仅sharedExamplesForThing。所以你正在做的事情应该假设共享的示例文件已经在spec文件之前加载。我认为你遇到的问题是首先加载spec文件(因为在加载文件时运行describe函数,而在加载所有文件后运行它的函数)。因此,您可能需要调整加载顺序,您可以尝试将共享示例文件放在support目录中,然后再要求它。

不是直接将变量分配给窗口对象,而是设置命名空间以将共享变量导出到最好(这样就不会使全局对象混乱):

window.MyNamespace = {}

MyNamespace.sharedExamplesForThing = ...

然后在您的spec文件中,您可以将其称为MyNamespace.sharedExamplesForThing

我发现查看生成的JavaScript以尝试理解CoffeeScript如何在文件之间导出变量很有帮助。

答案 2 :(得分:0)

这是我写的关于如何最好地做共享示例的博客文章。希望这会有所帮助。

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