【问题标题】:CI with emberjs带有 emberjs 的 CI
【发布时间】:2012-09-07 11:26:48
【问题描述】:

我目前正在研究如何将基于 ember.js 的应用程序的测试套件集成到 travis-ci 中。所以首先,我们不在开源服务上,我们将它用于私有存储库等。

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

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

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

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

【问题讨论】:

    标签: testing continuous-integration ember.js integration-testing travis-ci


    【解决方案1】:

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

    在我开始使用 ember.js 之前,我使用 jasmine 和一个名为 jasmine-node 的简单 node.js 模块进行单元测试。这让我可以从命令行快速运行一套 jasmine 单元测试,而无需打开浏览器或使用“js-test runner”/etc

    当我使用 jasmine、jquery 和简单的 javascript 模块来保持我的 javascript 代码可读性时,这非常有用。但是当我需要使用 ember/handlebars/etc 时,jasmine-node 模块就崩溃了,因为它希望你在全局和窗口上都有所有可用的东西。但是因为 ember 只是一个浏览器库,并不是所有东西都在“全局”上

    我开始研究 PhantomJS 并且像您自己一样看不到自己增加了复杂性。因此,我决定花一个周末来写下 jasmine 测试运行器空间中缺少的东西,而不是围绕这个问题进行破解。我想要 jasmine-node 的相同功能(这意味着我的 CI 盒子上只需要一个最新版本的 node.js 和一个简单的 npm 模块来运行测试)

    我编写了一个名为 jasmine-phantom-node 的 npm 模块,其核心是使用 node.js 来运行 phantomJS => 这反过来会启动一个常规的 jasmine html 运行程序并使用一个非常基本的 express web 应用程序抓取页面以获取测试结果.

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

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

    这是我最近在使用该测试运行程序时针对 ember 视图编写的示例 jasmine 单元测试。 Here 是完整的 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', '');
      });
    });
    

    这是我在上面进行单元测试的生产 ember 视图

    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 上手动运行一样 - 如果您推荐“process.exit(code=0);”行,您甚至可以自己在浏览器中查看它们。在 javascript 本身中(如果我需要查看完整的堆栈跟踪,我这样做是为了进行本地测试,因为 PhantomJS 没有带回足够的 html 只是还没有用我的 npm 模块刮掉它)。
    • 一旦 express web 应用程序启动了显示测试结果的 jasmine-html 页面,我使用 phantomJS 从 html 中抓取结果(通过 phantomjs-node)并查看测试是否通过或失败。它今天也可以在快速失败的混合模式下工作,因为它仍然运行所有这些但只显示第一次失败(再次 - 自以为是,但它帮助我专注于第一次失败的测试)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2013-12-08
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多