测试数据
当你的应用运行在测试模式下,它将被初始化一个没有任何数据的测试数据库。
如果你运行的测试依赖于使用数据库中特定的数据,你将需要在你的测试中执行一些 设置 步骤以便确认数据库是否已达到你期望的状态。这里有很多你可以用来做这些的工具。
确认数据库是否清空,xolvio:cleaner
包是相当有用的。你可以使用它在beforeEach
代码段中重置数据库:
import { resetDatabase } from 'meteor/xolvio:cleaner';
describe('my module', function () {
beforeEach(function () {
resetDatabase();
});
});
这项技术将只在服务端工作。如果你需要从客户端测试中重置数据库,你可以用如下方法:
import { resetDatabase } from 'meteor/xolvio:cleaner';
// NOTE: Before writing a method like this you'll want to double check
// that this file is only going to be loaded in test mode!!
Meteor.methods({
'test.resetDatabase': () => resetDatabase();
});
describe('my module', function (done) {
beforeEach(function (done) {
// 在继续执行之前我们需要去等待直到方法调用结束,所以我使用Mocha的同步机制(calling a done callback)
Meteor.call('test.resetDatabase', done);
});
});
当我们将上述代码放在测试文件中,它 并不会 在普通开发模式或生产模式下加载(如果加载的话,那将是难以想象的糟糕!)。如果你创建一个具有相同属性的Atmosphere包时,你需要标记它为testOnly
并且将同样也只在测试模式中加载。
生成测试数据
通常针对你的测试程序创建一组数据是非常明智的。你可以针对你的集合使用标准的insert()
方法,但往往创建帮助你编译随机测试数据的 工厂 也十分简单。在这方面我们推荐使用一款杰出的包dburles:factory
。
在示例应用Todos中,我们定义一个工厂用来描述如何创建一个todo测试项,在这里使用npm包faker
。
import faker from 'faker';
Factory.define('todo', Todos, {
listId: () => Factory.get('list'),
text: () => faker.lorem.sentence(),
createdAt: () => new Date(),
});
我们简单地调用Factory.create
在测试中使用工厂:
// 在数据库中创建一个todo和一个list并返回给todo。
const todo = Factory.create('todo');
// 如果我们已经有一个list,我们通过传递id避免重复创建。
const list = Factory.create('list');
const todoInList = Factory.create('todo', { listId: list._id });
Mock数据库
当Factory.create
直接向由Factory.define
方法定义的集合中直接插入文档时,在客户端使用它将是个问题。然而这里有一个优雅的隔离技巧,你可以试着用一个模拟出的本地集合替换服务端的Todos
客户端集合,这被编译在hwillson:stub-collections
包中。
import StubCollections from 'meteor/hwillson:stub-collections';
import { Todos } from 'path/to/todos.js';
StubCollections.stub(Todos);
// 现在Todos留存了一个简单的本地模拟集合,
// 所以在客户端我们可以这么做:
Todos.insert({ a: 'document' });
// 还原`Todos`集合
StubCollections.restore();
Mocha测试中,在beforEach
/afterEach
代码段中使用stub-collection
是比较合理的。