量角器Jasmine描述嵌套在它块内的块

时间:2013-12-13 20:08:09

标签: javascript angularjs testing jasmine protractor

首先,以下代码似乎有效。但是,我还没有看到有人这样做,所以我想知道这是否合法,如果我错过了不可预见的缺点。

上下文是我正在使用Protractor编写E2E测试,该测试使用Jasmine风格的describe / it块。我的目标是加载页面并运行一堆it测试块,而不是每次都重新加载该页面(因为它很耗时)。

我的构造是:

describe("Homepage", function () {

    beforeEach(function () {
        browser.get("/"); //loads the page
    });

    it('elements', function () {
        describe('test group', function () {
            it('test 1', function () {
                //run stuff 1
            });

            it('test2', function () {
                //run stuff 2
            });
        })
    });
});

我意识到另一种选择就是这样做:

describe("Homepage", function () {

    beforeEach(function () {
        browser.get("/"); //goes to homepage
    });

    it('elements', function () {
        //run stuff 1
        //run stuff 2

    });
});

但问题是我无法将测试分开,最终导致大it块。我想以某种方式避免每次运行beforeEach的问题,但仍然能够有一个很好的分离设置测试块。


顺便说一句,我也试过了:

describe("Homepage", function () {

    browser.get("/"); //goes to homepage

    it('elements', function () {
        //run stuff 1
        //run stuff 2

    });
});

除非当您有多个这样的规格时,这不起作用。在测试运行之前,browser.get()都会一个接一个地运行。

2 个答案:

答案 0 :(得分:7)

将断言分解为更小的块绝对是一个好主意。 Jasmine没有附加只运行一次的全局设置功能。 所以也许你可以欺骗beforeEach块只运行一次设置:

describe("Homepage", function() {
    var pageLoaded = false;

    beforeEach(function() {
        if ( ! pageLoaded) {
            browser.get("/");
            pageLoaded = true;
        }
    });
});

答案 1 :(得分:3)

Jasmine2有beforeAll()和afterAll(),它为整个套件运行一次。