茉莉花javascript spyon对象实例

时间:2015-12-11 00:54:35

标签: javascript jasmine bdd spyon

所以我有这个JS原型(类),我试图建立茉莉花测试,似乎无法弄清楚如何使这些测试工作。

这是班上的重要部分:

class Calendar extends BasicView
  initialize: (options) ->
    this.$el = options.el
    {@sidebar} = options
    this.$('.select-day').click this.display_date

    this

  display_date: (e) =>
    console.log 'display_date called' # <~~ this is printing
    ... do stuff ...

和我写的测试:

describe "Calendar", ->
  calendar = null

  beforeEach ->
    loadFixtures "calendar/calendar.html"

  describe "#initialize", ->
    beforeEach ->
      calendar = new Calendar().initialize
        el: $('.event-calendar')
        # just mocking dependency class
        sidebar: jasmine.createSpyObj(CurrentlyViewing, ["$"])

    it "listens for click event on .select-day", ->
      spyOn(calendar, 'display_date')
      calendar.$('.select-day:eq(1)').trigger 'click'
      expect(calendar.display_date).toHaveBeenCalled()

当我运行测试时,我得到Expected spy display_date to have been called.,尽管实际的方法被调用了。我知道,我所监视的不是我初始化的Calendar实例,但我无法弄清楚是怎么回事。

我很感激任何人都可以给我的帮助。

1 个答案:

答案 0 :(得分:0)

所以我在发布问题后20多分钟就想到了......我几乎总是这样做。

问题在于我将calendar变量设置为new Calendar().initialize(...)然后监视它(我猜)。以下是实际工作原理:

describe "Calendar", ->
  calendar = null

  beforeEach ->
    loadFixtures "calendar/calendar.html"
    calendar = new Calendar()
    spyOn calendar, 'display_date'

  describe "#initialize", ->
    beforeEach ->
      calendar.initialize
        el: $('.event-calendar')
        sidebar: jasmine.createSpyObj(CurrentlyViewing, ["$"])

    it "listens for click event on .select-day", ->
      calendar.$('.select-day:eq(1)').trigger 'click'
      expect(calendar.display_date).toHaveBeenCalled()