【问题标题】:How to reuse beforeEach/afterEach in Jasmine JS?如何在 Jasmine JS 中重用 beforeEach/afterEach?
【发布时间】:2013-06-23 11:03:07
【问题描述】:

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

})

【问题讨论】:

  • 每个页面都会有login_as_admin()logout()吗?

标签: javascript testing jasmine dry


【解决方案1】:

如果您想为所有套件执行此操作,您可以在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.getEnv().beforeEach(function () { //以管理员身份登录 });基于此处更改中包含的测试:github.com/jasmine/jasmine/issues/811
  • 看起来在beforeEach 中调用done() 回调很重要,因为没有它就会挂起。
【解决方案2】:

我认为这已部分检查 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() {});
});

【讨论】:

  • 博客文章的更新链接是herehere 是缺少代码sn-ps 的旧版本。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2023-01-17
      • 2019-01-03
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多