用流星进行测试驱动的开发

如果您最近关注了技术领域,那么Meteor对您来说并不是什么新鲜事物。 每周我们都会听到很多有关流星的好消息。

如果您以前从未听说过,Meteor是一个革命性的JavaScript框架,它使您可以非常快速地创建实时单页Web应用程序。 这是一个开源项目 ,但与其他项目不同,它拥有大量资金来保持快速发展。

流星不再是玩具

尽管Meteor还很年轻,但许多人还是渴望用它构建大量的生产应用程序。 这是因为它解决了一个实际问题,并使开发人员可以专注于应用程序逻辑,而不必担心如何管理服务器与客户端之间的通信。

在这里,我们谈论的是生产质量的应用程序,而不是原型。 因此,在发布一行代码之前,我们需要对其进行测试。 不幸的是,流星没有正式的测试框架- 。 但是他们确实有一个名为tinytest的测试框架,用于测试Meteor程序包-但不能测试整个应用程序。

流星测试框架应该是什么样的?

开发Meteor应用程序时,您将服务器和客户端代码同时编写在一起,并且它们之间是紧密相连的。 因此,我们应该能够编写涉及客户端和服务器的测试用例。

流星是关于实时的,以及我们如何在客户端(浏览器)之间共享数据。 因此,测试框架应该能够编写涉及多个客户端的测试用例。

最重要的是,它应该很有趣。

介绍Laika –流星的测试框架

Laika是流星的功能丰富的测试框架 ,可以满足上述所有要求。 Laika并不是第一个,也不是唯一的测试框架,但是它最易于使用且有据可查的。

网站: http//arunoda.github.io/laika/

使用Laika,您可以编写针对服务器和客户端的测试。 它可以与多个客户一起使用。 Laika针对您的实际应用程序运行测试,而不是使用某些模拟或存根,因此可以使您的测试更加准确。

Laika-流星测试框架

设置系统

莱卡(Laika)为您做一些幕后的魔术。 因此,它需要一些第三方工具才能在您的系统上使用。

  • 安装nodejs – Laika在nodejs上运行
  • 安装phantomjs – Laika使用phantomjs创建客户端
  • 安装mongodb – Laika每次测试都需要一个外部mongodb数据库

另外,

  • 您需要在运行测试时运行mongodb
  • 使用此命令以对Laika进行一些优化来启动mongodb

mongod --smallfiles --noprealloc --nojournal

最后,使用sudo npm install -g laika安装Laika。

入门指南

我们将在两种情况下测试流星集合。

  1. 从客户端插入文档并从服务器观察它
  2. 从客户端插入文档,测试另一个客户端正确地获取了文档

让我们创建流星应用程序

我们需要一个Meteor应用程序进行测试。 让我们来创建它。

  • meteor create hello-laika流星应用程序meteor create hello-laika
  • cd进入hello-laika

然后创建一个具有以下内容的名为collections.js的文件:

Posts = new Meteor.Collection('posts');

这个程序可以在github上找到

tests文件夹

所有Laika测试文件应位于Meteor应用程序的tests文件夹下。 tests是一个特殊的文件夹,因为其中的文件不会包含在客户端或服务器中。 这是流星本身的规则。

让我们写我们的第一个测试

在我们的tests文件夹下创建一个名为posts.js文件,其内容如下:(文件名没有限制,您可以随意命名( .js ))

var assert = require('assert');

    suite('Posts', function() {
      ltest('using both client and the server', function(done, server, client) {
        server.eval(function() {
          Posts.find().observe({
            added: addedNewPost
          });

          function addedNewPost(post) {
            emit('post', post);
          }
        })

        server.once('post', function(post) {
          assert.equal(post.title, 'hello title');
          done();
        });

        client.eval(function() {
          Posts.insert({title: 'hello title'});
        });
      });
    })

这是用nodejs编写的,所有内置节点模块都可以在测试中使用。 而且,如果您熟悉如何使用mocha编写测试,则应该都熟悉。

在这里,我们正在观察服务器中新文档的Post集合。 然后,我们使用客户端插入文档,这触发了我们的观察。

让我们回顾一下代码。

  • 第一行,我们正在加载nodejs assert模块来做断言
  • 然后我们创建一个名为“帖子”的测试套件
  • 在套件中,我们可以使用名称和回调创建测试(使用ltest方法)
  • 在回调中,我们接受服务器和客户端用于评估服务器和客户端中的代码
  • server.eval()方法允许我们评估服务器内部的代码
  • 您可以将一些结果发送回以使用server.once emit()进行测试,并通过server.onceserver.on
  • client.eval()行为相同,但是会评估客户端内部的代码
  • 其余代码不言自明

运行测试

创建测试后,

  • 转到项目文件夹
  • 运行莱卡

您会看到类似下面的内容。 如果出现错误,请仔细检查您的测试代码。
莱卡测试结果

创建我们的第二个测试

在您的测试套件Posts创建以下测试。

ltest('using two client', function(done, server, c1, c2) {
      c1.eval(function() {
        Posts.find().observe({
          added: addedNewPost
        });

        function addedNewPost(post) {
          emit('post', post);
        }
        emit('done');
      })

      c1.once('post', function(post) {
        assert.equal(post.title, 'from c2');
        done();
      })

      c1.once('done', function() {
        c2.eval(insertPost);
      });

      function insertPost() {
        Posts.insert({title: 'from c2'});
      }
    });

在这里,我们正在观察一个客户端中的一个集合,而另一个客户端中插入了一个文档。 让我们回顾一下。

  • 现在我们有2个客户端(c1和c2),而不是之前的测试中的一个
  • 您可以如上所述指定任意数量的客户端, laika可以为您创建客户端
  • 如果首先看c1.eval() ,那么有两个调用emit()
  • 我们可以随时从服务器/客户端emit()进行测试
  • 可以通过.on().once()捕获它们

现实生活中的用例

现在您已经了解了如何使用Laika。 但是莱卡可以做得更多。 它可以非常快速地测试流星特定的功能。 他们之中有一些是:

  • 流星方法
  • 出版物/订阅
  • 权限
  • 认证方式
  • 授权书

可以在此处找到一些示例– http://arunoda.github.io/laika/examples.html

莱卡如何内部运作

作为开发人员,我们始终对内部结构的工作方式感到好奇。 因此,在本部分中,您将了解Laika在内部的工作方式。

莱卡进行隔离测试

Laika为您编写的每个测试运行一个单独的应用,其中包含一个干净的数据库。 每个测试都是相互隔离的,因此您无需担心应用程序和数据库的清理状态。

因此,您的测试运行会慢一些。

服务器和测试通过TCP进行通信

在您的测试案例中,您可以简单地评估服务器内部的Meteor代码,但是Laika在内部可以为您做一些艰苦的工作。 当您开始测试时,Laika会将一些服务器端代码注入到Meteor应用程序中。 然后,它启动一个TCP服务器,Laika连接到它。

调用.eval()方法后,Laika将通过TCP连接将其发送到服务器。 如果有任何可用结果(在服务器中调用.emit() ),它也会通过相同的连接发送回服务器。

Laika最后会清除您应用中的注入代码。

客户端和服务器通过PhantomJS进行通信

就像服务器一样,Laika在后台为您做一些魔术。 对于您请求的每个客户端,Laika都会使用PhantomJS创建一个客户端,并将在该客户端上评估代码。 PhantomJS是不带UI的Webkit浏览器,因此我们在此处进行了真正的客户端测试。

莱卡使用摩卡咖啡

Laika的主要目标是成为流星针对其独特需求的测试框架,而不是创建另一个JavaScript测试框架。 mocha是一个非常好并且广泛使用的JavaScript / NodeJS测试框架,我们在内部使用它。 因此,摩卡咖啡中可用的大多数选项在莱卡中也可用。

查看laika命令行选项

错误处理

错误是人类常见的现象,因此编写一些带有错误的测试是很自然的。 它可以在测试本身上,也可以在服务器或客户端上进行评估。 Laika确实会处理这些错误并向您报告,因此您可以立即进行修复。

Laika-错误报告

不幸的是,Laika无法显示导致错误的行号,但是会显示发生在哪个测试中以及上下文。

语法糖

您已经看到Laika使用EventEmitter模式(或类似方式)在评估的代码和测试之间进行通信。 如果要从已评估的代码中触发多个结果,这将非常有用。

但是,如果您要发送单个结果并根据该结果进行测试,EventEmitter样式可能会令人头疼。 有时,您也会陷入回调地狱

Laika知道这很痛苦,它具有.evalSync()方法,可让您编写同步代码。 .evalSync()在服务器和客户端上均可用。 这是有可能的,因为每个测试都在Fiber内部进行。

让我们看看它的作用

具有EventEmitter风格

ltest('with eventEmitter style', function(done, server, client) {
      server.eval(function() {
        //assumes we do some real async work
        setTimeout(function() {
          emit('some-data', {data: 'data'});
        }, 100);
      });

      server.on('some-data', function(data) {
        client.eval(function(data) {
          //do something with the data
          emit('result', true);
        }, data);
      });

      client.on('result', function(result) {
        assert.ok(result);
        done();
      });
    });

### With .evalSync() synchronously

    ltest('wiht .evalSync()', function(done, server, client) {
      var data = server.evalSync(function() {
        setTimeout(function() {
          emit('return', {data: 'data'});
        }, 100);
      });

      var result = client.evalSync(function(data) {
        //do something with the data
        emit('return', true);
      }, data);

      assert.ok(result);
      done();
    })

您可以看到区别。 您必须使用特殊的emit('return', {some: 'data'})将执行发送回测试。 也可以使用其他的emit()事件,但是它们必须在emit('return')之后发生。

但是.evalSync()仅适用于主测试回调

没错, evalSync()仅在主测试回调中起作用。 如果尝试从嵌套回调中调用它,它将失败。 请参见下面的示例, 但是它失败了。

ltest('failing .evalSync()', function(done, server, client) {
      server.eval(function() {
        emit('some-event');
      });

      server.on('some-event', function() {
        var result = client.evalSync(function() {
          emit('return', true);
        });
        assert.ok(result, true);
        done();
      });
    })

嵌套回调中的Laika evalSync()

莱卡–项目

Laika是在OpenSource MIT许可下发布的,您可以将其用于任何目的。 如果您可以在博客文章或推文中提及Laika,我们将不胜感激。

该项目托管在github – Laika Meteor测试框架上

Laika是一个新框架,于2013年5月中旬发布。它经过了充分的测试,但可能会有一些极端情况。 如果您在Laika上度过了一段糟糕的时光,或者有话要说,请在github上使用我们的问题跟踪程序 ,或通过@arunoda与我联系。

所以。 你在等什么? 与Laika一起测试您的Meteor项目并立即发货。

From: https://www.sitepoint.com/test-driven-development-with-meteor/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值