测试数据

当你的应用运行在测试模式下,它将被初始化一个没有任何数据的测试数据库。

如果你运行的测试依赖于使用数据库中特定的数据,你将需要在你的测试中执行一些 设置 步骤以便确认数据库是否已达到你期望的状态。这里有很多你可以用来做这些的工具。

确认数据库是否清空,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是比较合理的。

results matching ""

    No results matching ""