Как установить данные модели в модульном тесте Ember.js для контроллера

Я пытаюсь написать модульный тест для проверки моего контроллера. У меня есть вычисляемое свойство, которое использует вычисляемое свойство модели.

Я не знаю, как настроить тест для загрузки данных в модель.

Вот у меня есть моя модель:

App.User = DS.Model.extend({
  name: DS.attr('string'),
  roles: DS.hasMany('role'),

  isInstructor: function(){
    return this.hasRole('instructor');
  }.property('roles'),

  hasRole: function(role_name){
    var roles = this.get('roles');
    if(!Ember.isEmpty(roles)){
      return roles.any(function(role){
        return role.get('name') === role_name;
      });
    }
    return false;
  }
});

И вот у меня есть мой контроллер:

App.MyClassDetailsController = Ember.ObjectController.extend({
  students: function () {
    return this.get('users').filter(function (user) {
      return !user.get('isInstructor');
    });
  }.property('content.users.@each')
});

И в моем тесте, когда я настраиваю контент для контроллера, я делаю это:

myClassDetailsController.set('model', Ember.ObjectProxy.create({
  id: 389,
  name: 'bfcoding 101',
  users: Ember.ArrayProxy.create({
    content: [
      Ember.ObjectProxy.create({id: 1, name: 'Joe', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor'})]})}),
      Ember.ObjectProxy.create({id: 2, name: 'vs', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'student'})]})}),
      Ember.ObjectProxy.create({id: 3, name: 'Volcano', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'student'})]})})
    ]
  })
}));

И это явно не загружает его правильно. Потому что, когда я вызываю этот метод студентов:

myClassDetailsController.get('students.length')

Он возвращает всех пользователей.

Вот jsbin http://jsbin.com/zafod/1/

В jsbin, когда он фильтрует всех пользователей, вычисляемое свойство isInstructor никогда не вызывается, потому что данные модели никогда не загружались (я полагаю). Когда я делаю этот вызов, он возвращается неопределенным.

Итак, как мне загрузить эти данные в модель?

Спасибо!


person bfcoder    schedule 22.05.2014    source источник
comment
Я все еще изучаю библиотеку ic-ajax Райана, мы решили не использовать ее в моем коде, но это потому, что мы писали ember-тесты в течение года или около того, поэтому она не добавила тонну в нашу среду.   -  person Kingpin2k    schedule 22.05.2014


Ответы (1)


isInstructor живет в экземплярах App.User, а не в экземплярах Ember.ObjectProxy. Вам нужно либо создать экземпляры App.User, либо просто определить isInstructor в экземпляре прокси.

Лично я бы сделал последнее. В идеальном мире юнит-тестов вы тестируете контроллер, а не App.User, поэтому все остальное следует высмеивать или считать, что оно работает идеально. Очевидно, что когда вы переключаетесь на интеграционное тестирование, все меняется, но опять же, это модульное тестирование.

Ember.ObjectProxy.create({id: 1, isInstructor: true, name: 'Joe', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor'})]})}),

http://jsbin.com/vavikuka/1/edit

person Kingpin2k    schedule 22.05.2014
comment
ааа, хорошая мысль. Поскольку у меня уже есть модельные тесты, чтобы убедиться, что isInstructor работает, лучше использовать mock. Погуглил и теперь все хорошо. Спасибо еще раз! - person bfcoder; 22.05.2014