Я начал тестировать реагирующее веб-приложение, но я не пошел далеко, потому что у меня были проблемы с логином. Я использую Cypress E2E инструмент тестирования.
Приветствуется страница приветствия с кнопкой для входа, которая перенаправит вас на услугу auth0
. Пользователь входит в систему по электронной почте и паролю, затем перенаправляется обратно в веб-приложение с токеном.
Я пробовал много разных подходов, каждый из которых приводил к отдельной проблеме.
Примечание: я не хочу проверять Auth0, я просто хочу войти в свое веб-приложение.
Попытка 1. Нажатие на кнопку входа в систему
Пробовал: Cypress должен делать то же, что и пользователь, поэтому в тесте нажмите кнопку входа в систему и перейдите к Auth0 и введите учетные данные.
Проблема: Cypress не позволяет вам перейти к другому домену во время теста.
Поскольку Cypress изменяет свой собственный URL-адрес хоста в соответствии с URL-адресом ваших приложений, он требует, чтобы ваше приложение оставалось на одном супердомене в течение всего одного теста.
Предполагается, что вы сможете отключить эту настройку "chromeWebSecurity": false
в cypress.json
, но она пока не будет работать, поскольку вы можете посетить только один домен с cy.visit()
Попытка 2. Войдите в систему программно из теста
Пробовал: войти в систему из кипарисного теста с библиотекой auth0-js
, поэтому не нужно нажимать кнопку входа в систему и, следовательно, не происходит никаких изменений домена.
describe('Waiting to fetch', () => {
beforeEach(() => {
this.fetchAuthDeferred = getDeferred()
cy.visit('http://localhost:3000', {
onBeforeLoad(win) {
cy.stub(win, 'fetch')
.withArgs($url)
.as('fetchAuth')
.returns(this.fetchAuthDeferred.promise)
}
})
})
it('login', () => {
cy.visit('http://localhost:3000')
const auth = new auth0.WebAuth(authOptions)
auth.login(loginOptions)
cy.get('@fetchAuth', { timeout: 10000 }).should('haveOwnProperty', 'token')
cy.visit('http://localhost:3000')
cy.get('[class*="hamburger"]').click()
})
})
Проблемы: cy.route()
не ждет запроса на выборку , обходной путь должен использовать cy.stub(win, 'fetch')
. Это не будет ждать:
Попытка 3. Войдите в систему программно из веб-приложения
Попробовал: я начал думать, что Cypress только шпионский запрос сделан из приложения, а не из самого теста (как я пытался в пункте выше).
Я добавил кнопку fake-login на странице приветствия, которая вызовет auth0-js
(без изменения домена) с жестко закодированными учетными данными и щелкнет по ней из теста
cy.get('#fake-login').click()
Проблемы: эта стратегия сработала, но, конечно, я не хочу добавлять кнопку с учетными данными на странице приветствия. Поэтому я попытался добавить элемент кнопки в веб-приложение во время теста:
it('Login adding element', () => {
cy.visit('http://localhost:3000')
const = document.createElement('div')
fakeLogin.innerHTML = 'Fake login'
fakeLogin.onclick = function() {
const auth = new auth0.WebAuth(authOptions)
auth.login(loginOptions)
}
fakeLogin.style.position = 'absolute'
fakeLogin.style.zIndex = 1000
fakeLogin.id = 'fake-login'
cy.get('#root').invoke('prepend', fakeLogin)
cy.get('#fake-login').click()
cy.get('[class*="hamburger"]').click() // Visible when logged in
})
И по какой-то причине это не работает, элемент добавляется, но yt не будет ждать, пока запрос не будет сделан.
Так что я не знаю, что еще попробовать.
Может быть, все это неправильное понимание того, как следует выполнять вход в E2E, мне следует работать с фиктивными данными, чтобы вход в систему не требовался?