如何在Jasmine JS中重用beforeEach/afterEach

How to reuse beforeEach/afterEach in Jasmine JS?

本文关键字:beforeEach afterEach Jasmine JS      更新时间:2023-09-26

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

有没有一种方法可以使用JasmineJS测试套件实现继承模型?

我可以将所有测试分组在一个describe中,但在这种情况下,我将以一个包含所有测试的巨大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()
    })
})

我认为这在这篇博客文章中得到了部分检查,也在这里得到了回答,但我为您的示例添加了一个经过调整的答案:

可重复使用代码:

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() {});
});

如果要为所有套件执行此操作,可以在topSuite:中注册beforeEachafterEach函数

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

如果您只想将其应用于某些套件,则可以使用子套件:

describe("as_admin", function() {
  beforeEach(function() {
    //log in as admin
  });
  describe('Services Page',function() {...});
  describe('Administrators Page',function() {...});
}

Jasmine允许您将beforeEachafterEach放在describe调用之外。通过这种方式,您可以对所有规格进行全局设置和拆卸。您的logout()调用似乎是全局拆卸的一个很好的候选者,如果您的所有规范都以管理员身份登录,您也可以将其转移到全局范围。

对于某些(但不是全部)规范中使用的东西,拥有像login_as_admin()这样的方法似乎是将逻辑整合在一个地方的最佳方式。

参考:(Pivotal Labs博客:Davis W.Frank)

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

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

在问题中找到。

因此,在3.7.0中,afterEach和其他方法一起从Env命名空间中移出,进入Globals。

测试.ts中的调用现在应该是:

afterEach(() => {});

就是这样。