2017-01-02 4 views
1

У меня есть одно действие, определенное в контроллере ember, который вызывает две отдельные функции, которые являются частью контроллера. Я хотел бы издеваться над этими функциями в модульном тесте, чтобы подтвердить, вызвал ли метод действия правильную функцию.Как протестировать контроллер ember

Мой контроллер выглядит следующим образом:

export default Ember.Controller.extend({ 
    functionA() { 
     return; 
    }, 
    functionB() { 
     return; 
    }, 
    actions: { 
     actionMethod(param) { 
      if(param) { 
       return this.functionA(); 
      } 
      else { 
       return this.functionB(); 
      } 
     } 
    } 
}); 

На практике, контроллер работает, однако в тестовом модуле, functionA и functionB оба не определены. Я попытался войти в консоль, но не могу найти там, где есть функция functionA и functionB, поэтому я не могу их правильно издеваться. Я ожидал, что они будут находиться на верхнем уровне объекта рядом с действиями, но вместо этого я нашел только _actions с корректным определением actionMethod.

Мой блок тест выглядит, как показано ниже

const functionA = function() { return; } 
const functionB = function() { return; } 
test('it can do something', function(assert) { 
    let controller = this.subject(); 
    // I don't want the real functions to run 
    controller.set('functionA', functionA); 
    controller.set('functionB', functionB); 
    controller.send('actionMethod', ''); 
    // raises TypeError: this.functionA is not a function 

    // this doesn't work etiher 
    // controller.functionB = functionB; 
    // controller.functionA = functionA; 
    // controller.actions.actionMethod(); 
} 

Кто-нибудь есть какие-либо идеи о том, как я могу заменить эти функции в среде тестирования? Или, может быть, есть лучший способ проверить эту функциональность или настроить мой контроллер?

  • редактировать опечатка: this.subject в this.subject()
+0

Сторона Примечание: 1. Чтобы создать объект контроллера, вам нужно вызвать 'this.subject()'. 2. Метод 'controller.send' не возвращает никакого значения вызывающему абоненту – kumkanillam

+0

Опечатка ооп - я назвал' this.subject() '. Что касается 'controller.send', я пробовал этот метод, как показано выше, а также вызывал' controller.actions.actionMethod() ' – user2989731

ответ

1

Для замены функции контроллера в блок теста , вы можете передать параметр в функции this.subject():

let controller = this.subject({ 
    functionA(){ 
     //this function overriddes functionA 
    }, 
    functionB(){ 
     //this function overriddes functionB 
    }, 
}); 

Посмотрите на the sample twiddle.

Этот метод особенно полезен для замены впрыскиваемых контроллеров service.

0

Ввести соответствующее свойство, которое вы имеете дело с, скажем name собственность, Так что ваши контроллеры будут выглядеть как это,

import Ember from 'ember'; 
export default Ember.Controller.extend({ 
    name:'', 
    functionA() { 
     this.set('name','A'); 
    }, 
    functionB() { 
     this.set('name','B'); 
    }, 
    actions: { 
     actionMethod(param) { 
      if(param) { 
       return this.functionA(); 
      } 
      else { 
       return this.functionB(); 
      } 
     } 
    } 
}); 

И вы можете проверить значение свойства name после звонка actionMethod.

test(" testing functionA has been called or not", function(assert){ 
    let controller = this.subject(); 
    controller.send('actionMethod',true); 
    //If you would like to call functionA just say controller.functionA() 
    assert.strictEqual(controller.get('name'),'A',' name property has A if actionMethod arguments true'); 
    controller.send('actionMethod',false); 
    assert.strictEqual(controller.get('name'),'B',' name property has B actionMethod arguments false'); 
}); 
+0

. Я просто пытаюсь ответить на ваш вопрос, чтобы узнать себя, быть откровенным, я не написал любое тестирование в моем проекте – kumkanillam

+0

Если вы хотите динамически определять свойства при создании объекта, вам необходимо передать его как аргумент методу 'subject', как мы делаем, когда мы создаем объект, используя' create() '. 'this.subject ({functionA: function() {this.set ('name', 'AA'); return;}});' – kumkanillam