Mocha beforeEach vs执行前

Tom*_*omo 50 mocha.js node.js

我最近遇到了一个无法解释的问题.我在这些测试中有很多代码,所以我会尽力在这里捕获这个想法

我的测试看起来像:

describe('main page', function(){
  beforeEach(function(done){
    addUserToMongoDb(done);   // #1
  });

  afterEach(function(done){
    removeUserFromMongoDb(done);
  });

  context('login', function(){
     it('should log the user in, function(){
       logUserIn(user_email);  // #2 - This line requires the user from the beforeEach
     });
  });

  context('preferences', function(){
    before(function(done){    //#3
       logUserInBeforeTest(user_email);
     });

    it('should show the preferences', function(){
       doCheckPreferences(); // #4
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

问题是,beforeEach #1运行正常.我可以看到它发生在数据库和测试#2传递中.

但是,首选项上下文中的测试#4失败,因为它无法找到用户登录它们#3.

似乎上下文before在describe之前执行beforeEach,导致它们失败.如果我移动logUserInit块中它工作正常.

什么可能导致这个?

Ste*_*ott 58

Mocha的测试运行器在Mocha Test RunnerHooks部分解释了这个功能.

从钩子部分:

describe('hooks', function() {

    before(function() {
        // runs before all tests in this file regardless where this line is defined.
    });

    after(function() {
        // runs after all tests in this file
    });

    beforeEach(function() {
        // runs before each test in this block
    });

    afterEach(function() {
        // runs after each test in this block
    });

    // test cases
});
Run Code Online (Sandbox Code Playgroud)

您可以将这些例程嵌套在其他描述块中,这些块也可以具有before/beforeEach例程.

  • 尊重,文档并没有很好地解释这种行为,正如关于这个特定主题的大量问题所证明的那样。@tomasz-wszelaki 的回答比逐字引用文档更有启发性。 (8认同)

小智 24

我发现了类似的问题.该文档具有误导性,因为"在此块之前"(至少对我来说)意味着"在此描述部分之前".同时它意味着"在任何描述部分之前".检查此示例:

describe('outer describe', function () {
    beforeEach(function () {
        console.log('outer describe - beforeEach');
    });

    describe('inner describe 1', function () {
        before(function () {
            console.log('inner describe 1 - before');
        });

    describe('inner describe 2', function () {
        beforeEach(function () {
            console.log('inner describe 2 - beforeEach');
        });
 });

 // output will be:
 // inner describe 1 - before
 // outer describe - beforeEach
 // inner describe 2 - beforeEach
Run Code Online (Sandbox Code Playgroud)

看来,在你的层次结构中放置它的位置并不重要before- 它将在任何描述之前运行,而不是在其包含描述之前运行.

  • 感谢您的澄清!这就是我问自己的问题,因为我在我们的项目中看到 before() 钩子定义在嵌套的describe()中,所以人们认为它是在describe上下文的关系中运行的,但事实并非如此。Mocha 文档在这个问题上可以更精确,并且充其量,除了最上面的describe()之外,不应该在其他任何地方允许它。 (2认同)
  • 感谢您的解释。我很震惊地发现 Mocha 发现之前的这个实现更多的是一个功能而不是一个错误。为什么它不尊重块(描述/上下文)范围?! (2认同)

Vic*_*rov 10

混淆的原因在于摩卡的文档.你可以在摩卡找到:

测试可以在钩子之前,之后或穿插时出现.钩子将按其定义的顺序运行,视情况而定; 所有before()挂钩运行(一次),然后任何beforeEach()挂钩,测试,任何afterEach()挂钩,最后挂钩()挂钩(一次).

讨论了钩子beforebeforeEach分别在所有或每个之前执行it- 在描述部分之前无法执行它.

在这里你可以找到 mocha主分支的#1贡献者的答案,添加类似beforeDescribe钩子的想法.

我想你应该看一下--delaymocha 选项.