【发布时间】:2012-05-09 14:56:57
【问题描述】:
我是jasmine的新手,想写一些mongodb操作的测试。
假设我在spec 目录下有几个.spec.js 文件,并且其中的所有测试都应该删除测试数据库并插入一些测试数据。
我应该如何组织代码?我应该在某处定义一个init() 方法,然后从所有其他测试中调用它吗?或者有没有更好的解决方案?
【问题讨论】:
标签: javascript unit-testing jasmine
我是jasmine的新手,想写一些mongodb操作的测试。
假设我在spec 目录下有几个.spec.js 文件,并且其中的所有测试都应该删除测试数据库并插入一些测试数据。
我应该如何组织代码?我应该在某处定义一个init() 方法,然后从所有其他测试中调用它吗?或者有没有更好的解决方案?
【问题讨论】:
标签: javascript unit-testing jasmine
在您的describe 中,您可以像往常一样使用测试框架调用beforeEach 和afterEach。这是设置和取消测试先决条件的正确位置。
例如:
describe('My Module', function () {
beforeEach(function () {
...
});
afterEach(function () {
...
});
it('...', function () { ... });
});
在任何情况下,尽管最好的做法是不实际执行数据库操作:大概您使用了一些已经测试过的库。如果您模拟您的数据库层,它将为您节省很多麻烦。您可以使用 spies 使用 jasmine 有效地做到这一点。
例如,假设您的 db 层有一个 get(id) 函数,该函数返回一些 json。你可以这样做:
it('can access the db', function () {
var spy = spyOn(db, 'get').andCallFake(function (id) {
expect(id).toEqual('foo');
return {title: 'Foo Bar'};
});
// Something here does stuff that would result to a call to db.get
var res = db_calling_function('foo');
expect(spy).toHaveBeenCalled();
expect(res).toEqual({title: 'Foo Bar'});
});
【讨论】:
initdb函数写在一个额外的文件里,让这些测试文件给require它,在beforeEach里面调用?
describe 上,它也会对所有内部测试运行。