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

IT技术 javascript testing jasmine dry
2021-02-28 07:11:36

使用 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()
    })

})
4个回答

我认为这在这篇博文中得到了部分检查也在这里得到了回答,但我正在为您的示例添加一个改编的答案:

可重用代码:

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() {});
});
博客文章的更新链接在这里这里是一个缺少代码片段的旧版本。
2021-04-29 07:11:36

如果您想为所有套件执行此操作,您可以在以下位置注册一个beforeEachafterEach函数topSuite

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

}
看起来调用done()回调很重要beforeEach因为它没有它的情况下挂起。
2021-04-17 07:11:36
我认为也可以使用: jasmine.getEnv().beforeEach(function () { //log in as admin }); 基于此处更改中包含的测试:github.com/jasmine/jasmine/issues/811
2021-04-27 07:11:36

Jasmine 确实允许您放置beforeEachafterEach退出describe呼叫。通过这种方式,您可以对所有规格进行全局设置和拆卸。您的logout()电话似乎很适合全局拆卸,如果您的所有规范都以管理员身份登录,您也可以将其移至全局范围。

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

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

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

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