你怎么能避免阻止beforeEach在一个特定阻止之前运行?

时间:2016-04-21 21:12:42

标签: javascript mocha

describe('1', function () {
  beforeEach(function () {
    // do this before each it EXCEPT 1.5
  });
  it('1.1', function () {

  });
  it('1.2', function () {

  });
  it('1.3', function () {

  });
  it('1.4', function () {

  });
  it('1.5', function () {
    // beforeEach shouldn't run before this
  });
});

我想阻止在beforeEach阻止it之前运行1.5。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

选项1

我建议使用嵌套你的描述,例如:

describe('1', function () {

  describe('1 to 4', function () {

    beforeEach(function () {
      // do this before each it EXCEPT 1.5
    });
    it('1.1', function () {

    });
    it('1.2', function () {

    });
    it('1.3', function () {

    });
    it('1.4', function () {

    });
  });

  describe('only 5', function () {
     it('1.5', function () {
     // beforeEach shouldn't run before this
  });

});

在幕后描述将注册beforeEach函数,如果它存在,将调用所有 itFunctions

选项2

函数将被顺序调用,因此您也可以使用闭包来控制beforeEach何时运行 - 但它有点hacky - 例如:

describe('1', function () {
  var runBefore = true
  beforeEach(function () {
    // do this before each it EXCEPT 1.5
    if (runBefore) {
        // actual code
    }
  });
  // functions removed for brevity    
  it('1.4', function () {
      runBefore = false;
  });
  it('1.5', function () {
    // beforeEach shouldn't run before this

    // turn it back on for 1.6
    runBefore = true;
  });
});

答案 1 :(得分:0)

您可以通过 avoiding nesting when you're testing 实现。这个想法是为了避免不必要的抽象,而是提取一些将设置测试用例的函数,然后在任何需要的地方调用这个函数。

这导致代码更具可读性和更易于维护。您不必通过跟踪所有嵌套的 beforeEach 调用来弄清楚测试用例中发生了什么,而是可以简单地逐行阅读。它使您的问题变得微不足道:

const setupTestCase = () => {
  // put the code here, instead of in beforeEach
  // if you're doing multiple actions, put them in separate functions and call them one by one
  // this makes your test more readable and easier to maintain
};

describe('1', function () {
  it('1.1', function () {
    setupTestCase();
    // do test stuff
  });
  it('1.2', function () {
    setupTestCase();
    // do test stuff
  });
  it('1.3', function () {
    setupTestCase();
    // do test stuff
  });
  it('1.4', function () {
    setupTestCase();
    // do test stuff
  });
  it('1.5', function () {
    // here we simply don't call setupTestCase()
    // do test stuff
  });
});

附注。此外,在许多情况下,您不需要顶级 describe 块,只需将每个顶级 describe 移动到单独的文件中,就可以使您的代码更具可读性并节省一层嵌套。