Jasmine (mocha) 嵌套“it”测试

Posted

技术标签:

【中文标题】Jasmine (mocha) 嵌套“it”测试【英文标题】:Jasmine (mocha) nested "it" tests 【发布时间】:2012-07-13 06:29:55 【问题描述】:

我试图测试项目的后续创建/删除(在 mongoDB 中通过 mongoose)。

创建的问题是异步的,它在回调函数中返回创建项目的ID,我需要这个ID来删除创建的项目,所以我尝试了下面的mocha代码(以不同的方式)但它没有工作。

describe('Item Model', function()

  it('should be able to create item', function(done)
    var item = new Item(name: first: "Alex");
    item.save(function(err, data)

      it('should be able to deleted created item', function(done)                    
        Item.delete(_id: data.id, function(err, data)
        done(err);
        );
      );

    )
  );

);

这样的测试可以在 mocha 或 jasmine 中实现吗?

【问题讨论】:

【参考方案1】:

我遇到过类似的问题,当我尝试嵌套的 describe/it 结构时,它确实有效。

describe('Item Model', () => 
   it('should be able to create item', done => 
      var item = new Item(name: first: "Alex");
      item.save(function(err, data)
         describe('Item Delete', () => 
            it('should be able to deleted created item', done => 
               Item.delete(_id: data.id, function(err, data)
                 done(err);
               );
            );
         );
      ); 
   );
);

【讨论】:

【参考方案2】:

我会为此做两个测试。一个是测试插入,一个是测试删除。

在咖啡脚本中应该看起来像这样

describe 'Item model', () ->
   item = ''
   before (done) ->
      item = new Item name: first: "Alex"
      done
    describe 'When inserting Item', () ->
        before (done) ->
            item.save done
        it 'should have been insterted' ->
            #CHECK HERE IT IF IT IS INSERTED

    decribe 'when deleting', () ->
        before (done) ->
            item.save (err,data) ->
                return done err if err
                Item.delete _id: data.id, done
        it 'should have been deleted' ->
            #CHECK HERE IT IF IT IS Deleted

【讨论】:

用 CoffeeScript 回答 javascript 问题是一种不好的做法。我确实喜欢 CoffeeScript,但并不是所有的 JS 程序员都能阅读和理解它。 CoffeeScript 不是 JS。正如 ClojureScript 不是 JS 一样。就像 C 不是汇编程序一样。不过这其实是一个jasmine/mocha问题,可以用预处理器语言写jasmine/mocha测试,应该没问题。 我不喜欢这件事,它延续了另一个 xmass 代码树......你的代码有 4 层深......但你只描述了一个嵌套的测试用例......每个人这似乎“还可以”..【参考方案3】:

看到这个问题: https://github.com/visionmedia/mocha/issues/438

似乎其目的是强制将测试解耦。虽然不方便并且可能需要更多的模拟,但这种行为很有用,因为它需要的重新测试更少,并且可以更清晰地了解到底发生了什么。

即有 2 个测试,测试 A 和测试 B,其中 B 依赖于 A。

测试 A 中断,因此 B 也中断。您修复了破坏测试 A 的内容,但现在可能会惊讶地发现测试 B 在您的修复过程中或由于不相关的原因而破坏。

当测试不相互依赖时,您可以获得更好的信息和更少的意外。

【讨论】:

以上是关于Jasmine (mocha) 嵌套“it”测试的主要内容,如果未能解决你的问题,请参考以下文章

Karma 与测试框架 Jasmine、Mocha、QUnit [关闭]

javascript 用于邮差测试脚本的mocha / jasmine兼容测试框架(缩小不到1KB)

html 转换器markdown多级列表到jasmine / mocha测试结构http://jsbin.com/qahurad

在 mocha 测试中使用带有 ts-node 的断言

接口测试自动化测试,我推荐使用Mocha

测试框架Mocha与断言expect