8

我在使用 Toran Billup 的TDD 指南对 ember 进行集成测试时遇到问题。

我使用 Karma 作为 Qunit 和 Phantom JS 的测试运行器。

我敢肯定,if 的一半与我初学者对 Ember 运行循环的了解有关。我的问题是两部分:

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");
        });
});

在此先感谢您提供正确方向的任何指示。

4

2 回答 2

7

我刚刚推出了一个示例应用程序,当您使用 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;
于 2013-07-27T14:53:45.190 回答
4

我不熟悉 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的信息

于 2013-07-27T06:12:22.233 回答