描述摩卡咖啡的作用是什么?

http://visionmedia.github.io/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(); }); }) }) }) 

我想知道什么时候应该在describe函数中嵌套我的testing, describe的基本目的是什么。 我可以比较第一个用编程语言来describe注释的第一个参数吗? 在控制台的输出中没有显示任何describe 。 这只是为了便于阅读,还是为了这个function还有其他用途?

如果我这样使用,有什么不对吗?

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

如果我这样做,testing仍然通过。

it调用标识每个单独的testing,但它本身并没有告诉摩卡关于你的testing套件是如何构build的 。 如何使用describe调用是给你的testing套件的结构。 以下是使用describe来构buildtesting套件的一些事情。 下面是一个testing套件的例子,为讨论的目的而简化:

 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 () { }); }); }); 

想象一下, FooBar是完整的类。 Foo cloneequals方法。 Barclone 。 上面的结构是为这些类构造testing的一种可能的方法。

#符号被某些系统(比如jsdoc)用来表示一个实例字段,所以当与一个方法名一起使用的时候,它表示一个在类实例上调用的方法(而不是一个类方法,调用这个类本身),testing套件运行的同样没有#的存在。)

提供横幅

摩卡的一些记者展示了你给出的名字来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) 

帮助select要运行的零件

如果你只想运行一些testing,你可以使用--grep选项。 所以如果你只关心Bar类,你可以做$ mocha -R spec --grep Bar ,并得到输出:

  Bar #clone ✓ clones the object 1 passing (4ms) 

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

  Foo #clone ✓ clones the object Bar #clone ✓ clones the object 2 passing (5ms) 

--grep的值被解释为一个正则expression式,所以当我通过\bclone\b我只要求单词clone ,而不是像clonescloned东西。

提供钩子

在上面的例子中, beforeEachafterEach调用是挂钩。 每个钩子都会影响处于钩子父节点的describe调用中的调用。 各种钩子是:

  • 在每个人之前运行的每个人itdescribe调用之内。

  • afterEach是每个人在describe调用之后运行的。

  • before运行describe函数before ,先运行一次。

  • after运行一次, itdescribe调用中运行。

这些钩子可用于获取资源或创buildtesting所需的数据结构,然后在testing完成后释放资源或销毁这些结构(如果需要)。

您在问题结束时显示的片段不会生成错误,但实际上并不包含任何testing,因为testing是由it定义的。

据我所知,描述真的只是为了人类…所以我们可以看到应用程序的不同领域。 你可以深入地描述n个层次。

 describe('user',function(){ describe('create',function(){} }); 

路易斯很好的答案是很难的。 描述块有几个优点,他没有提到哪些是skiponlyfunction。

 describe.skip(...) { ... } 

将跳过这个描述和所有它的嵌套描述和它的function:

 describe.only(...) { ... } 

将只执行描述和它的嵌套描述和它的function。 skip()only()修饰符也可以应用于it()函数。

描述仅仅是为了理解testing的目的而使用的,它也被用于对testing进行逻辑分组。 假设你正在testing数据库API,所有的数据库testing都可以在外层描述下,所以外层描述逻辑上把所有的数据库相关联。 可以说有10个数据库相关的API来testing,每个内部描述函数定义了什么样的testing….