如何在Jasmine JS中重用beforeEach / afterEach?

时间:2013-06-26 10:40:20

标签: javascript testing jasmine dry

使用JasmineJS编写测试时,我有许多测试具有类似的beforeEach / afterEach代码。

有没有办法使用JasmineJS测试套件实现继承模型?

我可以将所有测试分组到一个describe中,但在这种情况下,我将以包含所有测试的单个HUGE JS文件结束。

我想拆分每个页面的测试。

以下是一个例子:

describe('Services Page', function() {

    beforeEach(function() {
        login_as_admin()
    })

    beforeEach(function() {
        browser().navigateTo('/services')
    })

    if('Some test for services page', function() {})

    afterEach(function() {
        logout()
    })

})


describe('Administrators Page', function() {

    beforeEach(function() {
        login_as_admin()
    })

    beforeEach(function() {
        browser().navigateTo('/administrators')
    })

    if('Some test for administrators page', function() {})

    afterEach(function() {
        logout()
    })

})

4 个答案:

答案 0 :(得分:35)

我认为这部分经过了in this blog postanswered here的审核,但我为您的例子添加了一个经过调整的答案:

可重复使用的代码:

function sharedSetup(startPage) {
    beforeEach(function() {
        login_as_admin();
        browser().navigateTo(startPage);
    });

    afterEach(function() {
        logout();
    });
};

如何使用它:

describe('Services Page', function() {
    sharedSetup('/services');

    it('Some test for services page', function() {});
});

describe('Administrators Page', function() {
    sharedSetup('/administrators');

    it('Some test for administrators page', function() {});
});

答案 1 :(得分:17)

如果您想为所有套房执行此操作,可以在DateTime start = DateTime.Now; DateTime end = start.AddDays(20); foreach (var day in start.EachDay(end)) { ... } 注册beforeEachafterEach功能:

topSuite

如果您只想在某些套件上应用它,您可以使用子套件:

jasmine.getEnv().topSuite().beforeEach({fn: function() {
   //log in as admin
}});

答案 2 :(得分:3)

Jasmine允许您将beforeEachafterEach置于describe来电之外。通过这种方式,您可以对所有规格进行全局设置和拆卸。您的logout()电话似乎可能是全球拆解的良好候选人,如果您的所有规格都以管理员身份登录,您也可以将其移至全球范围。

对于某些(但不是全部)规范中使用的内容,使用类似login_as_admin()的方法似乎是在一个地方合并逻辑的最佳方式。

答案 3 :(得分:0)

参考:(Pivotal Labs Blog:Davis W. Frank

他描述了在函数中收集共享功能,该函数使用不同单个套件的参数调用。在每个套件中调用此函数将执行公共设置/配置。

关于跨文件拆分测试;如果测试是基于浏览器的,则具有共享功能的文件可以包含在具有<script>标记的每个页面中,如果测试是基于节点的,则可以包括在顶部附近的require(...)。然后,您可以单独运行测试,但使用仅定义一次的共享设置。