如果您最近关注了技术领域,那么Meteor对您来说并不是什么新鲜事物。 每周我们都会听到很多有关流星的好消息。
如果您以前从未听说过,Meteor是一个革命性的JavaScript框架,它使您可以非常快速地创建实时单页Web应用程序。 这是一个开源项目 ,但与其他项目不同,它拥有大量资金来保持快速发展。
流星不再是玩具
尽管Meteor还很年轻,但许多人还是渴望用它构建大量的生产应用程序。 这是因为它解决了一个实际问题,并使开发人员可以专注于应用程序逻辑,而不必担心如何管理服务器与客户端之间的通信。
在这里,我们谈论的是生产质量的应用程序,而不是原型。 因此,在发布一行代码之前,我们需要对其进行测试。 不幸的是,流星没有正式的测试框架- 尚 。 但是他们确实有一个名为tinytest的测试框架,用于测试Meteor程序包-但不能测试整个应用程序。
流星测试框架应该是什么样的?
开发Meteor应用程序时,您将服务器和客户端代码同时编写在一起,并且它们之间是紧密相连的。 因此,我们应该能够编写涉及客户端和服务器的测试用例。
流星是关于实时的,以及我们如何在客户端(浏览器)之间共享数据。 因此,测试框架应该能够编写涉及多个客户端的测试用例。
最重要的是,它应该很有趣。
介绍Laika –流星的测试框架
Laika是流星的功能丰富的测试框架 ,可以满足上述所有要求。 Laika并不是第一个,也不是唯一的测试框架,但是它是最易于使用且有据可查的。
网站: http : //arunoda.github.io/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。
入门指南
我们将在两种情况下测试流星集合。
- 从客户端插入文档并从服务器观察它
- 从客户端插入文档,测试另一个客户端正确地获取了文档
让我们创建流星应用程序
我们需要一个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.once
或server.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使用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是在OpenSource MIT许可下发布的,您可以将其用于任何目的。 如果您可以在博客文章或推文中提及Laika,我们将不胜感激。
该项目托管在github – Laika Meteor测试框架上 。
Laika是一个新框架,于2013年5月中旬发布。它经过了充分的测试,但可能会有一些极端情况。 如果您在Laika上度过了一段糟糕的时光,或者有话要说,请在github上使用我们的问题跟踪程序 ,或通过@arunoda与我联系。
所以。 你在等什么? 与Laika一起测试您的Meteor项目并立即发货。
From: https://www.sitepoint.com/test-driven-development-with-meteor/