Testing 余烬词

Testing 余烬词,testing,continuous-integration,ember.js,integration-testing,travis-ci,Testing,Continuous Integration,Ember.js,Integration Testing,Travis Ci,我目前正在研究如何将基于ember.js的应用程序的testsuite集成到travis ci中。首先,我们不使用开源服务,我们将其用于私有存储库等 我看了几个开源项目是如何运行他们的ember.js测试套件的,看起来他们用他们的项目设置了一个服务器,每当有人推到存储库时,这个服务器可能会更新。用于在该服务器上运行测试(实际上不是在travis ci本身上) 我使用这种方法的问题是,这增加了另一个步骤(并最终增加了复杂性):我必须用最新的代码更新和维护服务器,以便使用PhantomJS运行测试套

我目前正在研究如何将基于ember.js的应用程序的testsuite集成到travis ci中。首先,我们不使用开源服务,我们将其用于私有存储库等

我看了几个开源项目是如何运行他们的ember.js测试套件的,看起来他们用他们的项目设置了一个服务器,每当有人推到存储库时,这个服务器可能会更新。用于在该服务器上运行测试(实际上不是在travis ci本身上)

我使用这种方法的问题是,这增加了另一个步骤(并最终增加了复杂性):我必须用最新的代码更新和维护服务器,以便使用PhantomJS运行测试套件

另一个缺点是,我不知道它如何使我们能够测试PRs(拉请求)。服务器必须使用PR中的代码进行更新。在合并PRs之前测试PRs是travis ci的一大优点


我找不到关于仅通过CLI运行ember.js测试的更多/任何信息–我希望有人在我之前解决这个问题。

我无法回答您关于travis ci的问题。。。但是我可以提供一些关于使用jasmine对ember.js代码进行单元测试的想法

在我开始使用ember.js之前,我对jasmine和一个名为jasmine node的简单node.js模块进行了单元测试。这使我能够从命令行快速运行一套jasmine单元测试,而无需打开浏览器或使用“js test runner”等工具

当我使用jasmine、jquery和简单的javascript模块来保持javascript代码的可读性时,这种方法非常有效。但是当我需要使用ember/handlebar/etc时,jasmine节点模块就崩溃了,因为它希望您在全局和窗口上都有可用的一切。但因为ember只是一个浏览器库,所以并非所有内容都在“全局”上

我开始看幻影,就像你自己一样,看不到自己在增加复杂性。因此,我决定花一个周末,写下《茉莉花试跑者》空间中缺失的内容,而不是对此进行黑客攻击。我想要与jasmine node相同的功能(这意味着我在我的CI盒上只需要一个最新版本的node.js和一个简单的npm模块来运行测试)

我编写了一个名为node.js的npm模块,其核心是使用node.js运行phantomJS=>从而启动一个常规的jasmine html运行程序,并使用一个非常基本的express web应用程序在页面上搜索测试结果

我花了时间在github项目中放置了两个不同的示例,以便其他人可以看到它是如何快速工作的。它是自以为是的,因此您需要在项目根目录中包含一个html文件,插件将使用该文件执行测试。它还需要jasmine、jasmine html以及最近的jQuery

它为我个人解决了这个问题,现在我可以使用简单的jasmine编写针对ember的测试,并从cmd行运行它,而无需浏览器

这是一个jasmine单元测试示例,我最近在使用这个测试运行程序时针对一个余烬视图编写了它。是指向完整的ember/django项目的链接,如果您想查看被测视图在应用程序中的使用方式

require('static/script/vendor/filtersortpage.js');
require('static/script/app/person.js');

describe ("PersonApp.PersonView Tests", function(){

  var sut, router, controller;

  beforeEach(function(){
    sut = PersonApp.PersonView.create();
    router = new Object({send:function(){}});
    controller = PersonApp.PersonController.create({});
    controller.set("target", router);
    sut.set("controller", controller);
  });

  it ("does not invoke send on router when username does not exist", function(){
    var event = {'context': {'username':'', 'set': function(){}}};
    var sendSpy = spyOn(router, 'send');
    sut.addPerson(event);
    expect(sendSpy).not.toHaveBeenCalledWith('addPerson', jasmine.any(String));
  });

  it ("invokes send on router with username when exists", function(){
    var event = {'context': {'username':'foo', 'set': function(){}}};
    var sendSpy = spyOn(router, 'send');
    sut.addPerson(event);
    expect(sendSpy).toHaveBeenCalledWith('addPerson', 'foo');
  });

  it ("does not invoke set context when username does not exist", function(){
    var event = {'context': {'username':'', 'set': function(){}}};
    var setSpy = spyOn(event.context, 'set');
    sut.addPerson(event);
    expect(setSpy).not.toHaveBeenCalledWith('username', jasmine.any(String));
  });

  it ("invokes set context to empty string when username exists", function(){
    var event = {'context': {'username':'foo', 'set': function(){}}};
    var setSpy = spyOn(event.context, 'set');
    sut.addPerson(event);
    expect(setSpy).toHaveBeenCalledWith('username', '');
  });
});
下面是我在上面进行单元测试的ProductionEmber视图

PersonApp.PersonView = Ember.View.extend({
  templateName: 'person',
  addPerson: function(event) {
    var username = event.context.username;
    if (username) {
      this.get('controller.target').send('addPerson', username);
      event.context.set('username', '');
    }
  }
});

谢谢分享这篇文章——我没有深入研究代码,但它到底是从什么地方刮来的呢?当涉及到phantomjs时,人们似乎使用了一个外部主机,他们也必须对其进行更新。我想避免这样。前几周,我们用jstestrunner等建立了一个完整的测试环境。我一直想把它写在博客上,并在这里发布。但是让我知道你做了什么。不需要外部主机:D-每次套件运行时,我都会创建一个node.js express web应用程序,它承载使用npm模块所需的单个html文件。这个文件使用jasmine和jasmine html来运行测试,就像你在OSX/Ubuntu上手动运行测试一样——如果你在javascript本身中划出“process.exit(code=0);”一行,你甚至可以自己在浏览器中查看它们(如果我需要查看完整的stacktrace,我会在本地测试中这样做,因为PhantomJS还没有带回足够的html来使用我的npm模块进行刮取。)一旦express web app出现显示测试结果的jasmine html页面,我就使用PhantomJS从html中刮取结果(通过PhantomJS节点)看看测试是通过了还是失败了。它现在也可以在fail-fast混合模式下工作,因为它仍然运行所有测试,但只显示第一次失败(再次-自以为是,但它帮助我专注于第一次失败的测试)