在每个规范中,我都有beforeEach
和afterEach
语句。是否有可能以某种方式在全局添加它以避免规范之间的代码重复?
答案 0 :(得分:3)
beforeEach()
和afterEach()
函数的目的是添加每次启动或完成每个规范(it
)时需要执行的重复代码块。还有其他方法可以添加通用代码以避免代码重复,这里有一些 -
describe
)之前只运行一次,那么您可以使用jasmine提供的beforeAll()
和afterAll()
函数。 onPrepare()
和onComplete()
函数中。beforeLaunch
和afterLaunch
。所以这一切都取决于你想要使用它们的场景。希望它有所帮助。
答案 1 :(得分:0)
我的团队也希望在每个测试文件的开头运行样板代码。在这里的讨论中,听起来好像没有要全局添加到beforeEach()
,afterEach()
等的钩子。
但是,我们要做使用onPrepare()
函数来简化每个规格文件中重复的样板代码之前/之后的数量。以下是一个beforeAll()
示例,但是该模式可以用于beforeEach()/afterEach()
。在这种情况下,我们将使用DataSeeder类在数据库中设置测试用户,我们在每个spec文件的最外面的describe()
块中进行此操作。 (我也将继续使用catchProtractorErrorInLocation
模式,因为它对我们非常有用。)
在protractor.conf.ts中,将样板代码添加到browser.params
对象中。
onPrepare: function () {
...
const browser = require('protractor').browser;
// Define the ConsoleHelper & DataSeeder instances, which will be used by all tests.
const DataSeeder = require('./e2e/support/data-seeder.js');
browser.params.dataSeeder = new DataSeeder();
browser.catchProtractorErrorInLocation = (error, location) => {
throw new Error(`Error in ${location}\n ${error}`);
};
browser.catchProtractorErrorInBeforeAll = (error) => browser.catchProtractorErrorInLocation(error, 'beforeAll()');
// Return a promise that resolves when DataSeeder is connected to service and ready to go
return browser.params.dataSeeder.waitForConnect();
},
有了这些,我们可以轻松地在一组简短的行中进行beforeAll()
设置代码。
beforeAll(() => {
return browser.params.dataSeeder.createTestUsers()
.catch(browser.catchProtractorErrorInBeforeAll);
});
您显然需要在设置中执行其他操作,但是您可以看到该模式如何应用。