javascript 如何在 Jasmine JS 中重用 beforeEach/afterEach?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17317839/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to reuse beforeEach/afterEach in Jasmine JS?
提问by Adi Roiban
When writing tests with JasmineJS I have many tests that have similar beforeEach/afterEach code.
使用 JasmineJS 编写测试时,我有许多测试具有类似的 beforeEach/afterEach 代码。
Is there a way to implement an inheritance model using JasmineJS test suites?
有没有办法使用 JasmineJS 测试套件实现继承模型?
I can group all tests in a single describe
but in this case I will end with a single HUGE JS file containing all tests.
我可以将所有测试组合成一个,describe
但在这种情况下,我将以一个包含所有测试的巨大 JS 文件结束。
I would like to split the tests for each page.
我想为每个页面拆分测试。
Here is an example:
下面是一个例子:
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()
})
})
采纳答案by Leo Gallucci
I think this is partially examined in this blog postand also answered herebut i'm adding an adapted answer for your example:
我认为这在这篇博文中得到了部分检查,也在这里得到了回答,但我正在为您的示例添加一个改编的答案:
Reusable code:
可重用代码:
function sharedSetup(startPage) {
beforeEach(function() {
login_as_admin();
browser().navigateTo(startPage);
});
afterEach(function() {
logout();
});
};
How to use it:
如何使用它:
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() {});
});
回答by Steven
If you want to do this for all your suites, you can register a beforeEach
or afterEach
function in the topSuite
:
如果您想为所有套件执行此操作,您可以在以下位置注册一个beforeEach
或afterEach
函数topSuite
:
jasmine.getEnv().topSuite().beforeEach({fn: function() {
//log in as admin
}});
If you only want to apply it on some suites, you can work with sub-suites:
如果您只想将其应用于某些套件,则可以使用子套件:
describe("as_admin", function() {
beforeEach(function() {
//log in as admin
});
describe('Services Page',function() {...});
describe('Administrators Page',function() {...});
}
回答by Gregg
Jasmine does allow you to put beforeEach
and afterEach
outside of a describe
call. In this way you can have setup and teardown that is global for all of your specs. Your logout()
call seems like it might be a good candidate for global teardown, and if all of your specs login as an admin, you could move that out to global scope as well.
Jasmine 确实允许您放置beforeEach
和afterEach
退出describe
呼叫。通过这种方式,您可以对所有规格进行全局设置和拆卸。您的logout()
电话似乎很适合全局拆卸,如果您的所有规范都以管理员身份登录,您也可以将其移至全局范围。
For things that are used in some, but not all, specs, having a method like your login_as_admin()
seems like the best way to consolidate that logic in one place.
对于在某些(但不是全部)规范中使用的东西,拥有像您login_as_admin()
这样的方法似乎是将这种逻辑整合到一个地方的最佳方式。
回答by xst
Reference: (Pivotal Labs Blog:Davis W. Frank)
参考:(Pivotal Labs 博客:Davis W. Frank)
He describes collecting shared functionality in a function that is called with parameters for the different individual suites. Calling this function within each suite will execute the common setup/configuration.
他描述了在一个函数中收集共享功能,该函数通过不同的单个套件的参数调用。在每个套件内调用此函数将执行通用设置/配置。
As to splitting tests across files; the file with the shared function can either be included within each page with a <script>
tag if the tests are browser based, or by a require(...)
near the top if the tests are node based. You can then run the tests independently but using that shared setup which is defined only once.
至于跨文件拆分测试;<script>
如果测试是基于浏览器的,则具有共享功能的文件可以包含在每个页面中并带有标签,如果测试是基于require(...)
节点的,则可以包含在靠近顶部的标签中。然后您可以独立运行测试,但使用仅定义一次的共享设置。