Как выполнить интеграционное тестирование Ember для переходов маршрутов?

У меня возникла проблема при тестировании интеграции с ember с использованием Руководство по TDD.

Я использую Karma в качестве тестового запуска с Qunit и Phantom JS.

Я уверен, что половина этого связана с моими начальными знаниями о runloop Ember. Мой вопрос состоит из 2 частей:

1) Как правильно включить тест vist() в цикл выполнения?

2) Как проверить переходы? Индексный маршрут ('/') должен перейти в ресурсный маршрут под названием "projects.index".

module("Projects Integration Test:", {
  setup: function() {
    Ember.run(App, App.advanceReadiness);
  },
  teardown: function() {
    App.reset();
  }
});

test('Index Route Page', function(){
    expect(1);
    App.reset();    
        visit("/").then(function(){
            ok(exists("*"), "Found HTML");
        });
});

Заранее спасибо за любые указатели в правильном направлении.


person ganicus    schedule 26.07.2013    source источник
comment
Какую версию Ember вы используете? Я не упомянул критическую ошибку в RC 6, которая ломается при посещении / route github. com/emberjs/ember.js/issues/2997   -  person Toran Billups    schedule 27.07.2013
comment
Ах! Я использую R6.1! Извините, я забыл упомянуть в своем вопросе. Большое спасибо за Вашу помощь!   -  person ganicus    schedule 29.07.2013


Ответы (2)


Я только что выложил пример приложения, которое выполняет простой переход, когда вы нажимаете маршрут «/» с помощью ember.js RC5.

https://github.com/toranb/ember-testing-example

Простой пример «hello world» выглядит так

1.) шаблон, на который вы перенаправляетесь во время перехода

<table>
{{#each person in controller}}
<tr>
  <td class="name">{{person.fullName}}</td>
  <td><input type="submit" class="delete" value="delete" {{action deletePerson person}} /></td>
</tr>
{{/each}}
</table>

2.) код приложения ember.js

App = Ember.Application.create();

App.Router.map(function() {
    this.resource("other", { path: "/" });
    this.resource("people", { path: "/people" });
});

App.OtherRoute = Ember.Route.extend({
    redirect: function() {
        this.transitionTo('people');
    }
});

App.PeopleRoute = Ember.Route.extend({
    model: function() {
        return App.Person.find();
    }
});

App.Person = Ember.Object.extend({
    firstName: '',
    lastName: ''
});

App.Person.reopenClass({
    people: [],
    find: function() {
        var self = this;
        $.getJSON('/api/people', function(response) {
            response.forEach(function(hash) {
                var person = App.Person.create(hash);
                Ember.run(self.people, self.people.pushObject, person);
            });
        }, this);
        return this.people;
    }
});

3.) интеграционный тест выглядит так

module('integration tests', {
    setup: function() {
        App.reset();
        App.Person.people = [];
    },
    teardown: function() {
        $.mockjaxClear();
    }
});

test('ajax response with 2 people yields table with 2 rows', function() {
    var json = [{firstName: "x", lastName: "y"}, {firstName: "h", lastName: "z"}];
    stubEndpointForHttpRequest('/api/people', json);
    visit("/").then(function() {
        var rows = find("table tr").length;
        equal(rows, 2, rows);
    });
});

4.) помощник по интеграции, который я использую в большинстве своих проектов ember.js

document.write('<div id="foo"><div id="ember-testing"></div></div>');

Ember.testing = true;

App.rootElement = '#ember-testing';
App.setupForTesting();
App.injectTestHelpers();

function exists(selector) {
    return !!find(selector).length;
}

function stubEndpointForHttpRequest(url, json) {
    $.mockjax({
        url: url,
        dataType: 'json',
        responseText: json
    });
}

$.mockjaxSettings.logging = false;
$.mockjaxSettings.responseTime = 0;
person Toran Billups    schedule 27.07.2013

Я не знаком с Karma, но части вашего теста, которые должны взаимодействовать с ember, должны быть помещены в цикл выполнения (как вы упомянули)

Ember.run.next(function(){
  //do somethin
  transition stuff here etc
});

Чтобы проверить текущий маршрут, вы можете украсть информацию из уголька, вот некоторая информация, которую я украл из переполнения стека в какой-то момент.

var router = App.__container__.lookup("router:main"); //get the main router
var currentHandlerInfos = router.router.currentHandlerInfos; //get all handlers
var activeHandler = currentHandlerInfos[currentHandlerInfos.length - 1]; // get active handler
var activeRoute = activeHandler.handler; // active route

Если вы начнете тестировать контроллеры, я написал некоторую информацию об этом http://discuss.emberjs.com/t/unit-testing-multiple-controllers-in-emberjs/1865

person Kingpin2k    schedule 27.07.2013
comment
Ember.run.next() запустил мой тест без ошибок, но я получаю сообщение о сбое, в котором говорится, что утверждений не было? Мне нравится приведенный выше пример о подключении к текущему маршруту для получения текущей информации об обработчиках. Я обязательно поиграю с этим в своем тестировании! - person ganicus; 30.07.2013