как использовать контроллер модульного тестирования, который использует this.get('store')

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

AS.MyController = Ember.ObjectController.extend(Ember.Validations.Mixin, {

    name: null,
    description: null,

    init: function () {
        this._super();

        this.get('store').find('something');
    },
    ....
}); 

И мой тест начинается так:

describe("MyControllerTest", function () {
    //tried but didn't work
    //delete AS.MyController.init;
    var controller = AS.MyController.create();
    .....
})  

и браузер всегда выдает ошибку при вызове this.get('store') в init. Я не уверен, нужно ли мне что-то заглушать, или для этого есть обходной путь, потому что мой тестовый пример вообще не полагается на хранилище. В любом случае, я не смог найти там многого и был бы очень признателен за любую обратную связь.

Спасибо, Ди

JSBIN: http://jsbin.com/aMASeq/3/

ОБНОВЛЕНИЕ: может быть много способов решить эту проблему, но в итоге я немного реструктурировал код контроллера, поместив все вызовы функций для сохранения в отдельные действия, а затем в init я совершать вызовы этих функций действий, используя this.send('actionName'). В моем модульном тесте перед созданием экземпляра контроллера я снова открываю контроллер, чтобы изменить эти функции действия (проще изменить функцию действия, чем изменить саму функцию инициализации, при попытке изменить инициализацию я всегда сталкивался с некоторой ошибкой js). Например:

AS.MyController.reopen({actions: {setSomeActionThatUsesStore: function () {
         //do something that doesn't involve using store
        }}});

person Deewendra Shrestha    schedule 31.10.2013    source источник
comment
Почему вы звоните в магазин найти внутри инициализации?   -  person Marcio Junior    schedule 01.11.2013
comment
У меня есть элемент выбора в шаблоне руля, который заполняется содержимым, возвращаемым этим вызовом поиска. У меня тоже нет роутера для этого контроллера, потому что я вызываю его через рендер-контроллер в другом шаблоне.   -  person Deewendra Shrestha    schedule 01.11.2013
comment
И что за ошибка вылетает?   -  person Marcio Junior    schedule 01.11.2013
comment
Я получаю TypeError: this.get(...) равно null, я также добавил ссылку jsfiddle в свой исходный пост, которая выдает ту же ошибку.   -  person Deewendra Shrestha    schedule 01.11.2013


Ответы (1)


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

var mockContainer = new Ember.Container();
mockContainer.register('store:main', Ember.Object.extend({ 
  find: function() { ... }
});

var controller = App.PostController.create({ container: mockContainer });

Если вам нужен доступ к реальному store, вы можете просто взять контроллер из контейнера вашего приложения.

var controller = App.__container__.lookup('controller:post');

Это создаст для вас экземпляр PostController, в котором все его зависимости (например, хранилище) связаны вместе.

person Ryan    schedule 01.11.2013
comment
Спасибо, Райан, за ответ, я попробовал: var mockContainer = new Ember.Container(); mockContainer.register('store:main', { find: function() { console.log(здесь); return null; }}); var controller = AS.AnalyticsTemplateNewController.create({ container: mockContainer }); но я все еще получаю TypeError: this.get(...) is null error - person Deewendra Shrestha; 01.11.2013
comment
У вас много проблем с вашей скрипкой. 1) Вы не создаете магазин, что, вероятно, должны были бы сделать. 2) Вы не даете Ember достаточно времени для инициализации всего, вы сразу же приступите к тестированию (см. приложение deferReadiness/setupForTesting. 3) Придирка, но вы используете старые версии ember и данных, обновите их до последней для улучшения работы. Вы можете узнать больше о настройке приложения для тестирования: codingvalue.com/blog/testing -emberjs-руководство - person Ryan; 01.11.2013
comment
Привет, Райан, спасибо за ссылку, я думаю, это будет полезно прочитать. Извините, я просто взял рабочую скрипку из сети и модифицировал ее под свои нужды, чтобы получить быструю обратную связь, но я прочитаю статью и вернусь к проблеме. - person Deewendra Shrestha; 01.11.2013
comment
Дайте мне знать, если у вас есть какие-либо вопросы, и не стесняйтесь делиться столько скрипок, сколько вам нужно. - person Ryan; 01.11.2013
comment
Привет, Райан, на этот раз я создал jsbin с последними файлами js в jsbin.com/aMASeq/3. . Я не смог найти размещенную ссылку на expect.js, поэтому просто вставил туда весь код. Я не уверен, как настроить хранилище, когда я создаю экземпляр контроллера с функциями создания. Спасибо. - person Deewendra Shrestha; 01.11.2013
comment
О, как бы я хотел использовать Qunit, но в моей рабочей среде они используют мокко, и мой запрос на использование quint не сработал. На данный момент я мог бы обойтись проверкой Ember в тестовом режиме или нет, а затем полностью пропустить часть магазина на основе этого. - person Deewendra Shrestha; 04.11.2013