如果当前测试用例失败并继续运行下一个测试用例之后如何跳过afterEach挂钩?

时间:2014-04-06 23:58:41

标签: mocha

describe("Test1", function() {
  before("at the start", function() {
   console.log("AT the begining of the test case");
   setup();
  }

  beforeEach("before test case", function() {
   console.log("at the begining of the test case");
   testsetup();
  }

  afterEach("at the end of test case", function() {
   console.log("at the end of test case");
   cleanup();
  }

  after("at the end of test", function() {
   console.log("at the end of test");
   commoncleanup();
  }

  it("test case1", function() {
   var retval = sum(2,5);
   assert.equal(retval, "then sum is 5");
  }

  it("test case2", function() {
   var retval = sum(5,5);
   assert.equal(retval, "the sum is 10");
  }
});

如果beforeEach代码失败或抛出错误,它将继续测试case1和afterEach挂钩。但我希望如果beforeEach失败,它应该跳过测试case1和afterEach挂钩,然后继续运行测试用例2和afterEach挂钩。我的意思是如果任何钩子失败它应该跳过当前的测试用例并继续运行下一个测试用例。 我希望预期的输出是:

Test1
AT the beginning of the test case
before test case
x beforeEach hook fails
before test case
test case2 
at the end of test case
at the end of test
1 passing (8ms)
1 failing (0ms)

请帮我找到解决方案。

2 个答案:

答案 0 :(得分:3)

您可以使用this.currentTest.state(不确定何时引入):

afterEach(function() {
  if (this.currentTest.state == 'failed') {
    // ...
  }
});

答案 1 :(得分:1)

没有用于获得你想要的东西的旗帜。 Mocha的设计使得任何钩子中的错误都会立即终止测试。 (在钩子中出错后,Mocha将继续运行afterEachafter挂钩,但不会继续运行测试。)

做你想做的事的一种方法是:

  1. 写下您的beforeEach,以便记录设置是否成功。

  2. 编写测试以检查测试设置是否正确设置,如果不正确则设置失败。

  3. 编写afterEach,以便在未正确设置测试设置时不会失败。

  4. 如何执行此操作的详细信息实际上取决于您的应用程序,但它可能如下所示:

    describe("Test1", function() {
        var set = false; // Variable indicating whether our setup is set or not.
    
        beforeEach("before test case", function() {
            set = testsetup();
        });
        afterEach("at the end of test case", function() {
            if (set)
                cleanup();
        });
        it("test case1", function() {
            assert.true(set, "we have a proper setup");
            // whatever tests
        });
    
        it("test case2", function() {
            assert.true(set, "we have a proper setup");
            // whatever tests
        });
    });
    

    在上面的代码中assert是您用于测试的一些断言库,testsetup是一个函数,可以创建需要为测试创建的内容并以原子方式成功或失败(即它

    这样,如果设置仅在一次测试中失败,那么只有这个测试会失败。