我试图通过提取共享示例来干掉一些茉莉花测试。
@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)
答案 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/