摩卡是如何执行“它”的?电话?如何同步执行测试?

时间:2016-08-02 18:48:51

标签: javascript unit-testing testing mocha

观察以下测试:

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

前两个测试失败。但我不明白为什么!我做错了什么?

测试显示以下内容:

NPM test result using Mocha

我将QUnit移植到Mocha,我正在查看断言的位置。
在QUnit中你有模块 - >测试 - >断言。
在这里描述 - >描述 - >它'?的

4 个答案:

答案 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映射到describeQUnit.test映射到itassert映射到expect

我写了一篇关于这个主题的博客:Convert QUnit test to Mocha / Chai