描述摩卡咖啡的作用是什么?
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 () { }); }); });
想象一下, Foo
和Bar
是完整的类。 Foo
clone
和equals
方法。 Bar
有clone
。 上面的结构是为这些类构造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
,而不是像clones
或cloned
东西。
提供钩子
在上面的例子中, beforeEach
和afterEach
调用是挂钩。 每个钩子都会影响处于钩子父节点的describe
调用中的调用。 各种钩子是:
-
在每个人之前运行的每个人
it
在describe
调用之内。 -
afterEach
是每个人在describe
调用之后运行的。 -
before
运行describe
函数before
,先运行一次。 -
after
运行一次,it
在describe
调用中运行。
这些钩子可用于获取资源或创buildtesting所需的数据结构,然后在testing完成后释放资源或销毁这些结构(如果需要)。
您在问题结束时显示的片段不会生成错误,但实际上并不包含任何testing,因为testing是由it
定义的。
据我所知,描述真的只是为了人类…所以我们可以看到应用程序的不同领域。 你可以深入地描述n个层次。
describe('user',function(){ describe('create',function(){} });
路易斯很好的答案是很难的。 描述块有几个优点,他没有提到哪些是skip
和only
function。
describe.skip(...) { ... }
将跳过这个描述和所有它的嵌套描述和它的function:
describe.only(...) { ... }
将只执行描述和它的嵌套描述和它的function。 skip()
和only()
修饰符也可以应用于it()函数。
描述仅仅是为了理解testing的目的而使用的,它也被用于对testing进行逻辑分组。 假设你正在testing数据库API,所有的数据库testing都可以在外层描述下,所以外层描述逻辑上把所有的数据库相关联。 可以说有10个数据库相关的API来testing,每个内部描述函数定义了什么样的testing….