改进Jasmine规范以测试调用参数的属性

时间:2011-12-06 22:16:35

标签: jquery coffeescript jasmine

我正在使用以下Coffeescript代码来验证一个backbone.js视图的初始化构建另一个:

describe 'Avia.AviaView', ->

  beforeEach ->
    @aviaView = new Avia.AviaView(addFixtureDiv('avia'))
    @matricesView = new Backbone.View()

    spyOn(Avia, 'MatricesView').andCallFake(
      (element) =>
        if !element
          throw "Expected MatricesView to be constructed with a parent element"
        else if element.attr('id') != 'tabs-3'
          throw "Expected MatricesView to be constructed with the parent element #tabs-3"
        else
          @matricesView
    )

  describe 'initialize', ->

    beforeEach ->
      @aviaView.initialize()

    it 'creates a new MatricesView ', ->
      expect(Avia.MatricesView).toHaveBeenCalledOnce()

这很好用,但我不禁想到它应该有可能改进它。我想象的语法如下:

it 'creates a new MatricesView ', ->
  expect(Avia.MatricesView).toHaveBeenCalledMatching((args...) => args[0].attr('id') == 'tabs-3')

...其中toHaveBeenCalledMatching采用一个接受参数splat的函数,并返回truthy表示成功,否则返回falsy。

有没有人遇到这样的事情,还是我需要在这里自己动手?或者,有没有人更好地建议如何改进此代码?

1 个答案:

答案 0 :(得分:1)

toHaveBeenCalledWith()不适合你吗?在大多数情况下,您要么提前知道值,要么可以计算它们。

如果您确实需要使用函数来评估调用的args,则可以使用单独的期望值argsForCall来单独测试每个arg。

如果最坏的情况发生,你可以随时编写自己的匹配器。但这比前两个听起来要困难得多:)