【问题标题】:How to organize the code if I want to initialize database before each tests?如果我想在每次测试之前初始化数据库,如何组织代码?
【发布时间】:2012-05-09 14:56:57
【问题描述】:

我是jasmine的新手,想写一些mongodb操作的测试。

假设我在spec 目录下有几个.spec.js 文件,并且其中的所有测试都应该删除测试数据库并插入一些测试数据。

我应该如何组织代码?我应该在某处定义一个init() 方法,然后从所有其他测试中调用它吗?或者有没有更好的解决方案?

【问题讨论】:

    标签: javascript unit-testing jasmine


    【解决方案1】:

    在您的describe 中,您可以像往常一样使用测试框架调用beforeEachafterEach。这是设置和取消测试先决条件的正确位置。

    例如:

    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里面调用?
    • 我正在测试模型层,我应该使用真实的数据库来测试,对吧?
    • 关于许多测试,您可以将 beforeEach 放在一个外部 describe 上,它也会对所有内部测试运行。
    • 关于真正的数据库,老实说我认为没有。最好不要依赖真正的数据库可访问,使您的设置更容易,测试更快。此外,您的 db API 肯定是经过独立测试的。当然,这不应该阻止您进行额外的功能/集成测试,以确保整个设置正常工作。
    • 在上面添加你真正的模式灵活的模拟而不是真实的东西。您可以以更简单的方式模拟失败条件。
    猜你喜欢
    • 2016-10-18
    • 2014-03-17
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多