2013-10-07 2 views
0

Я использую mocha для запуска тестов против нового написанного класса и для создания сравнения нужно построить число Event. Я планировал использовать заглушки объектов и заменять их фактическими экземплярами класса Event, у которых есть конструктор async из-за использования соединения с БД. Таким образом, я использую рекурсивный вызов, чтобы последовательно обрабатывать заглушки. И вот в чем проблема: все мои объекты-заглушки заменены последним экземпляром, и я понятия не имею, почему. Пожалуйста, объясните мне, где я ошибаюсь.Неожиданный beahviour при замене свойств объекта

Event.coffee:

class Event 
    start = 0 
    duration = 0 
    title = "" 
    atype = {} 

    constructor: (_start, _duration, _title, _atype, cb) -> 
     start = _start 
     duration = _duration 
     title = _title 

     evt = @ 
     ActivityType.find({} = 
      where: {} = 
       title: _atype 
     ).success((res) -> 
      atype = res 

      cb? evt 
     ).error(() -> 
      throw new Error "unable to assign atype '#{_atype}'" 
     ) 
# ... 

Event.test.coffee:

# ... 
suite "getEventAt",() -> 
    events = 
     FREE: {} = 
      start: 0 
      duration: Day.MINUTES_PER_DAY 
      title: "Free time" 
      type: "FREE" 
     REST: {} = 
      start: 10 
      duration: 30 
      title: "rest" 
      type: "_REST" 
     FITNESS: {} = 
      start: 30 
      duration: 30 
      title: "fitness" 
      type: "_FITNESS" 
     WORK: {} = 
      start: 20 
      duration: 30 
      title: "work" 
      type: "_WORK" 

    suiteSetup (done) -> 
     buildEvent = (ki) -> 
      ks = Object.keys events 
      ((k) -> 
       v = events[k] 
       new Event v.start, v.duration, v.title, v.type, (e) -> 
        events[k] = e 
        if k == ks[ks.length-1] 
         return done?() 
        return buildEvent(ki+1) 
      )(ks[ki]) 
     buildEvent(0) 
# ... 

ответ

2

название длительности пуска и atype является переменным классом, таким образом, перезаписывается каждый раз, когда вы создаете новое событие

class Event 

    constructor: (_start, _duration, _title, _atype, cb) -> 
     @start = _start 
     @duration = _duration 
     @title = _title 

     evt = @ 
     ActivityType.find({} = 
      where: {} = 
       title: _atype 
     ).success((res) => 
      @atype = res 

      cb? evt 
     ).error(() -> 
      throw new Error "unable to assign atype '#{_atype}'" 
     ) 

Обратите внимание на плоскую стрелку при обратном вызове успеха (см.: http://coffeescript.org/#fat-arrow для фута er подробности)

Смежные вопросы