将Jasmine的规格整合到一次测试中

时间:2015-06-25 09:48:26

标签: jasmine

我有以下情况:

describe('Base test suite', function () {
    beforeEach(function (done) {
        // an initialization routine with done as the callback
        veryLongInitialization(done);
    });

    it('description of first spec', function (done) {
        // first expectations

        done();
    });

    describe('nested suite that builds upon the base test suite', function () {
        beforeEach(function (done) {
            secondVeryLongInitialization(done);
        });

        it('description of second spec', function (done) {
            // second expectations
        });
    });

    describe('second nested suite that builds upon the base test suite', function () {
        beforeEach(function (done) {
            thirdVeryLongInitialization(done);
        });

        it('description of third spec', function (done) {
            // third expectations
        });
    });
});

如您所见,我们有一些嵌套的测试套件。外部beforeEach在内部veryLongInitialization之前被调用非常重要。

  • 执行外部期望(第一个规范)时,veryLongInitialization必须已完成。
  • 对于第二个规范(第一个嵌套规范),要求secondVeryLongInitializationveryLongInitialization已按顺序执行,并且已成功完成。
  • 同样,对于第三个规范(第二个嵌套规范),要求thirdVeryLongInitializationveryLongInitialization已按顺序执行,并且已成功完成。

到目前为止效果非常好。

然而,在第一个规范中有许多期望,所以基本上不可能为它写一个简短的描述。

所以我们考虑将第一个规格分成几个规格,每个规格只有几个期望。这样可以轻松编写有意义的简短规范说明。

然而,会降低整个测试执行速度,因为必须为每个规范执行veryLongInitialization

因此我们考虑将beforeAll放入beforeEach块而不是veryLongInitialization。这只会执行veryLongInitialization一次,然后运行所有规范,从而加快整体测试执行速度。

然而,这意味着veryLongInitialization() secondVeryLongInitialization() thirdVeryLongInitialization() 只会运行一次。这意味着第三个规范将在序列

之后运行
secondVeryLongInitialization

这是不正确的。 it('should do this', function () { ... }).and('should do that', function () { ... }).and('should also behave like this', function () { ... }).and('should also behave like that', function () { ... }); 不应该在第三个规范之前运行。

我希望你看到我们的困境。 这种情况有更好的方法吗?

我们希望看到的是将规范组合在一起的一些方法,例如:

beforeEach

这些规范将在一次测试运行中运行,所有这些规范只有一个if(!ispostback){ }

1 个答案:

答案 0 :(得分:1)

我认为这可行:将第一步规格合并到单独的describe并在所有规则之前运行veryLongInitialization。之后,在每个veryLongInitializationdescribe之前运行secondVeryLongInitialization。第三步也是如此。这样您就必须运行veryLongInitialization三次,但根据您的描述,它实际上是特定套件所需要的。如果您担心veryLongInitialization的代码重复,可以将其移动到单独的函数,并在需要时多次调用。

describe('Base test suite', function () {

    // for multiple time usage
    var veryLongInitialization = function (done) {
        done();
    };

    describe('first', function () {

        beforeAll(function (done) {
            veryLongInitialization(done);
        });

        // ...
    });

    describe('second', function () {

        beforeAll(function (done) {
            veryLongInitialization(done);
        });

        beforeEach(function (done) {
            secondVeryLongInitialization(done);
        });

        // ...
    });

    describe('third', function () {

        beforeAll(function (done) {
            veryLongInitialization(done);
        });

        beforeEach(function (done) {
            thirdVeryLongInitialization(done);
        });

        // ...
    });

});