describe()在摩卡中的作用是什么?

Rit*_*tta 65 testing unit-testing mocha.js node.js

官方Mocha网站上的文档包含以下示例:

describe('User', function(){
  describe('#save()', function(){
    it('should save without error', function(done){
      var user = new User('Luna');
      user.save(function(err){
        if (err) throw err;
        done();
      });
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

我想知道什么时候我应该在describe函数中嵌套我的测试,以及它的基本目的describe是什么.我可以将传递给的第一个参数与describe编程语言中的注释进行比较吗?describe控制台上的输出中未显示任何内容.它仅用于可读性目的,还是有其他用途用于此功能?

如果我像这样使用它有什么问题吗?

describe('User', function(){
    describe('#save()', function(){
        var user = new User('Luna');
        user.save(function(err){
            if (err) throw err;
            done();
        })
    })
})
Run Code Online (Sandbox Code Playgroud)

如果我这样做,测试仍然通过.

Lou*_*uis 75

it调用标识了每个单独的测试,但它本身it并没有告诉Mocha任何关于测试套件结构的信息.如何使用describe调用是为测试套件提供结构的原因.以下是describe用于构建测试套件的一些内容.这是一个测试套件的示例,为了讨论的目的而简化:

function Foo() {
}

describe("Foo", function () {
    var foo;
    beforeEach(function () {
        foo = new Foo();
    });
    describe("#clone", function () {
        beforeEach(function () {
            // Some other hook
        });
        it("clones the object", function () {
        });
    });
    describe("#equals", function () {
        it("returns true when the object passed is the same", function () {
        });
        it("returns false, when...", function () {
        });
    });
    afterEach(function () {
        // Destroy the foo that was created.
        // foo.destroy();
    });
});

function Bar() {
}

describe("Bar", function () {
    describe("#clone", function () {
        it("clones the object", function () {
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

试想一下,FooBar有全面的课程.Foocloneequals方法.Barclone.我上面的结构是构建这些类的测试的一种可能方法.

(该#符号用于由一些系统(例如像,jsdoc)以指示实例字段.因此,与方法名中使用时,它表示所谓的类(而不是一个类方法的一个实例的方法,其被称为关于类本身).测试套件也可以在没有存在的情况下运行#.)

提供横幅

摩卡的一些记者describe在他们制作的报告中显示了你给出的名字.例如,spec记者(你可以通过跑步使用$ mocha -R spec)报告:

  Foo
    #clone
      ? clones the object 
    #equals
      ? returns true when the object passed is the same 
      ? returns false, when... 

  Bar
    #clone
      ? clones the object 


  4 passing (4ms)
Run Code Online (Sandbox Code Playgroud)

帮助选择要运行的部件

如果只想运行某些测试,可以使用该--grep选项.所以如果你只关心这个Bar类,你可以做$ mocha -R spec --grep Bar,并得到输出:

  Bar
    #clone
      ? clones the object 


  1 passing (4ms)
Run Code Online (Sandbox Code Playgroud)

或者,如果您只关心clone所有类的方法,那么$ mocha -R spec --grep '\bclone\b'获取输出:

  Foo
    #clone
      ? clones the object 

  Bar
    #clone
      ? clones the object 


  2 passing (5ms)
Run Code Online (Sandbox Code Playgroud)

赋予的值--grep被解释为正则表达式,所以当我通过时我\bclone\b只要求单词clone,而不是像clones或者那样的东西cloned.

提供挂钩

在上面的示例中,beforeEachafterEach调用是挂钩.每个钩子都会影响it调用内部的describe调用,这些调用是钩子的父级.各种钩子是:

  • beforeEachitdescribe呼叫中的每个人之前运行.

  • afterEachitdescribe呼叫中的每个人之后运行.

  • before在运行it内部任何个人之前运行一次describe.

  • afteritdescribe调用内部的所有个人运行后运行一次.

这些挂钩可用于获取资源或创建测试所需的数据结构,然后在测试完成后释放资源或销毁这些结构(如果需要).

您在问题结尾处显示的代码段不会生成错误,但实际上并不包含任何测试,因为测试是由定义的it.


Zek*_*erg 7

据我所知,描述真的只适用于人类...所以我们可以看到应用程序的不同区域.你可以深入地描述n级.

describe('user',function(){
    describe('create',function(){}
});
Run Code Online (Sandbox Code Playgroud)


Kar*_*Rao 5

描述只是为了理解测试的目的,它也用于对测试进行逻辑分组。假设您正在测试数据库 API,所有数据库测试都可以位于外部描述之下,因此外部描述在逻辑上对所有相关数据库进行分组。假设有 10 个与数据库相关的 API 需要测试,每个内部描述函数都定义了这些测试是什么......

  • @AndrewS,您还可以使用“套件”和“描述”一词可以互换使用。您还可以调用“it”和“test”https://github.com/mochajs/mocha/blob/master/lib/mocha.js#L249-L263 (2认同)

Guy*_*Guy 5

路易斯的优秀答案很难增加.描述块有几个优点,他没有提到哪些是skiponly功能.

describe.skip(...) {
...
}
Run Code Online (Sandbox Code Playgroud)

将跳过此描述及其所有嵌套的描述和功能,同时:

describe.only(...) {
...
}
Run Code Online (Sandbox Code Playgroud)

将只执行该描述及其嵌套的描述和它的功能.的skip()only()改性剂也可以被施加到它()函数.