Не удалось протестировать вложенные маршруты ember

Я использую карму с qUnit (после того, как прочитал это руководство), чтобы протестировать приложение Ember. В основном все идет хорошо, однако я столкнулся с проблемой, которая не имеет смысла.

Учитывая 2 следующих теста:

test('can get to products', function() {
  visit('/products/')
    .then(function() {
      ok(find('*'));
    });
});


test('can get to catalogues', function() {
  visit('/products/catalogues')
    .then(function() {
      ok(find('*'));
    });
});

Первый пойдет нормально. Тестовый бегун добирается до /products и что-то находит.

Однако второй тест возвращает ошибку в консоли:

Error: Assertion Failed: You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in an Ember.run

Я включил журналы переходов, и программа запуска тестов посещает products.catalogues.index перед тем, как выдать ошибку.

Любые идеи с этим? Или это просто ошибка в инструментах тестирования Ember?

Оба являются допустимыми маршрутами, определенными внутри маршрутизатора...


person Iest    schedule 13.09.2013    source источник
comment
Какая версия emberjs?   -  person Marcio Junior    schedule 13.09.2013
comment
RC7, к сожалению... Мне нужно обновиться до 1.0.0, но есть много критических изменений/предупреждений об устаревании...   -  person Iest    schedule 13.09.2013
comment
Если вы видите этот jsfiddle jsfiddle.net/marciojunior/pG7Rv, нет необходимости использовать Ember .бегать. Но думаю, что твой вариант понадобится. Не уверен.   -  person Marcio Junior    schedule 13.09.2013
comment
Я нашел полный источник руководства github. com/toranb/ember-testing-example/blob/master/js/tests/, может поможет.   -  person Marcio Junior    schedule 13.09.2013


Ответы (1)


Последняя часть ошибки содержит ключ к решению этой проблемы. Вы должны убедиться, что любой код, выполняющий асинхронные вызовы, заключен в Ember.run. Сюда входят такие простые вещи, как методы create и set.

Если у вас есть что-то вроде

App.ProductsRoute = Ember.Route.extend({
    model: function() {
        return [
            Ember.Object.create({title: "product1"}),
            Ember.Object.create({title: "product2"})
        ]
    }
});

преобразовать его в

App.ProductsRoute = Ember.Route.extend({
    model: function() {
        return [
            Ember.run( Ember.Object, "create", {title: "product1"} ),
            Ember.run( Ember.Object, "create", {title: "product2"} )
        ]
    }
});

или

App.ProductsRoute = Ember.Route.extend({
    model: function() {
        return Ember.run(function() {
            return [
            Ember.Object.create({title: "product1"}),
            Ember.Object.create({title: "product2"})
            ]
        });
    }
});

Если бы вы разместили свой код /products, было бы легче дать более конкретный ответ.

person Taras Mankovski    schedule 13.09.2013
comment
Итак, мне нужно реорганизовать мою реальную кодовую базу, чтобы использовать Ember.run всякий раз, когда я делаю что-то асинхронное, просто чтобы это работало для тестирования? - person Iest; 13.09.2013
comment
Вы были правы - это модельный хук внутри App.CataloguesRoute вызывал ошибку. Однако это всего лишь простой фрагмент кода ember-data с использованием App.Catalogue.find();. Он все еще выдает ошибки, и я не могу загрузить страницу :( - person Iest; 14.09.2013
comment
Если маршрутизатор Ember в последнее время не стал умнее, возвращение результата Ember.run не является общим решением. В частности, если вы хотите, чтобы model возвращало обещание отложить переход, Ember.run скроет это обещание от маршрутизатора. - person James A. Rosen; 15.09.2013