观察以下测试:
describe("Testing i", function(){
var i = 0;
it('i should be 0', function() {
expect(i).to.equal(0);
});
i++;
it('i should be 1', function() {
expect(i).to.equal(1);
});
i= 7;
it('i should be 7', function() {
expect(i).to.equal(7);
});
});
前两个测试失败。但我不明白为什么!我做错了什么?
测试显示以下内容:
我将QUnit移植到Mocha,我正在查看断言的位置。
在QUnit中你有模块 - >测试 - >断言。
在这里描述 - >描述 - >它'?的
答案 0 :(得分:2)
你做错了测试。整个测试,变量设置和所有,必须在it
函数内。
it
函数的作用只是将测试推送到一个列表,该列表将由describe
函数或mocha本身执行。 it
函数不执行测试。
编写测试的正确方法如下:
describe("Testing i", function(){
it('i should be 0', function() {
var i = 0;
expect(i).to.equal(0);
});
it('i should be 1', function() {
var i = 0;
i++;
expect(i).to.equal(1);
});
it('i should be 7', function() {
var i = 0;
i = 7;
expect(i).to.equal(7);
});
});
FWIW。除非您将参数传递给it
函数的回调,否则所有测试都会同步执行。只是他们没有在describe
函数内执行。 it
函数只会将您的所有it
次调用编译为测试列表。
因此,如果您需要执行一系列操作,则可以执行此操作:
describe("Testing i", function(){
var i;
it('i should be 0', function() {
i = 0;
expect(i).to.equal(0);
});
it('i should be 1', function() {
i++;
expect(i).to.equal(1);
});
it('i should be 7', function() {
i = 7;
expect(i).to.equal(7);
});
});
但请注意,建议不要这样做,因为如果第一次测试失败,那么以下某些测试也可能会失败。在此示例中,如果第一个测试失败,因为i
的值不为0,则第二个测试也将失败。但是,此模式可能对执行时间较长的步骤很有用(例如,网站登录)。
这允许mocha像进度条等那样进行花哨的测试报告。在不知道要运行多少测试(测试是it
函数)的情况下,mocha无法知道绘制进度条的百分比。 / p>
它还允许mocha对错误消息进行奇特的格式化。如果您使用过mocha,则会注意到mocha会收集所有错误消息(失败)并在最后打印出来。要做到这一点,mocha所做的是以受控方式一次执行一个测试(it
函数)并收集所引发的任何错误。如果你单独依赖javascript语法,那是不可能的,除非你用C语言破解解释器。但如果你有一个数组内的函数列表并且一次只执行一个函数,你就可以这样做。
答案 1 :(得分:2)
回答问题,执行流程如何运作。 Mocha以describe block开头。
首先,在描述块中,它执行所有不在it
块中的代码。
因此,在您的代码中,首先执行这3个语句,然后执行it
块
var i = 0;
i++;
i=7;
分配给i的最后一个值是7。 现在它将开始执行它。
答案 2 :(得分:0)
类似于Mocha文档的解决方案 https://mochajs.org/
describe("Testing i", function(){
var i;
it('i should be 0', function() {
i = 0;
expect(i).to.equal(0);
});
it('i should be 1', function() {
i++;
expect(i).to.equal(1);
});
it('i should be 7', function() {
i= 7;
expect(i).to.equal(7);
});
});
呼叫顺序,如问题中所述 我使用本文http://cwinters.com/2014/09/26/mocha-nested-hook-ordering.html
中的改编代码对其进行了测试这是代码,我用过
'use strict';
describe('level 1', function() {
before(function() { console.log("L1 - before") });
beforeEach(function() { console.log("L1 - beforeEach") });
after(function() { console.log("L1 - after") });
afterEach(function() { console.log("L1 - afterEach") });
console.log("inner DESCRIBE BEFORE L1A") // equivalent to asigning the variable the first time
it('L1 test A', function() {});
console.log("inner DESCRIBE BEFORE L1B") // equivalent to asigning the variable the second time
it('L1 test B', function() {});
describe('level 2', function() {
before(function() { console.log("L2 - before") });
beforeEach(function() { console.log("L2 - beforeEach") });
after(function() { console.log("L2 - after") });
afterEach(function() { console.log("L2 - afterEach") });
it('L2 test A', function() {});
it('L2 test B', function() {});
});
});
这里是结果
inner DESCRIBE BEFORE L1A // execute First
inner DESCRIBE BEFORE L1B // execute Second
level 1 // now the test are executed
L1 - before
L1 - beforeEach
√ L1 test A
L1 - afterEach
L1 - beforeEach
√ L1 test B
L1 - afterEach
level 2
L2 - before
L1 - beforeEach
L2 - beforeEach
√ L2 test A
L2 - afterEach
L1 - afterEach
L1 - beforeEach
L2 - beforeEach
√ L2 test B
L2 - afterEach
L1 - afterEach
L2 - after
L1 - after
4 passing (64ms)
=> describe
块将立即执行,因此在调用任何其他函数之前,最后一个将覆盖同一变量的多个变量。
前两个测试失败,因为i==7
执行所有三个测试时。
如果确实需要序列,你可以使用闭包,但这会增加更多的复杂性。
答案 3 :(得分:0)
看起来如下:
describe("Testing i", function(){
it('i increments', function(){
var i = 0;
expect(i, 'i should be 0').to.equal(0);
i++;
expect(i, 'i should be 1').to.equal(1);
i = 7;
expect(i, 'i should be 7').to.equal(7);
});
});
QUnit.module
映射到describe
,QUnit.test
映射到it
,assert
映射到expect
。
我写了一篇关于这个主题的博客:Convert QUnit test to Mocha / Chai。