Как повторно использовать beforeEach/afterEach в Jasmine JS?
При написании тестов с 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()
})
})
Ответы
Ответ 1
Я думаю, что это частично рассмотрено в этом сообщении в блоге, а также ответил здесь но я добавляю адаптированный ответ для вашего примера:
Многоразовый код:
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() {});
});
Ответ 2
Если вы хотите сделать это для всех своих наборов, вы можете зарегистрировать функцию beforeEach
или afterEach
в 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() {...});
}
Ответ 3
Жасмин позволяет вам помещать beforeEach
и afterEach
за пределы вызова describe
. Таким образом, у вас может быть настройка и сглаживание, которые являются глобальными для всех ваших спецификаций. Ваш вызов logout()
кажется, что он может быть хорошим кандидатом на глобальное отключение, и если все ваши спецификации войдут в систему как администратор, вы также можете перенести это в глобальную область.
Для вещей, которые используются в некоторых, но не для всех спецификациях, метод, подобный вашему login_as_admin()
, кажется лучшим способом консолидировать эту логику в одном месте.
Ответ 4
Ссылка: (Блог Pivotal Labs: Дэвис У. Франк)
Он описывает сбор общих функций в функции, вызываемой с параметрами для разных отдельных наборов. Вызов этой функции в каждом пакете будет выполнять общую настройку/конфигурацию.
Что касается разделения тестов на файлы; файл с общей функцией может быть включен в каждую страницу с тегом <script>
, если тесты основаны на браузере, или require(...)
в верхней части, если тесты основаны на node. Затем вы можете запускать тесты самостоятельно, но используя эту общую настройку, которая определяется только один раз.