Я не совсем уверен, что вы ищете на этом этапе, но нашел способ сбросить эффект библиотеки zepto.
Подводя итог,
-
zepto - это jquery -совместимая библиотека, которая принимает глобальный $
в окне вашего приложения. ref
$ = функция (селектор, контекст) {
return zepto.init (селектор, контекст)
}
в результате такие команды cy, как .get()
и .wrap()
, дают форму в zepto-wrapped результата jquery, который не совместим с chai expect()
без некоторой деструктуризации.
Экспериментируя с Cypress.$
Я обнаружил, что он все еще ссылается на jquery propper, например
const h2 = Cypress.$('h2')
возвращает объект jquery, а не объект zepto, поэтому мы можем сбросить глобальное приложение $
из Cypress. $.
it('title display', () => {
cy.visit('index.html') // zepto takes effect here
// Reset $
const win = cy.state('window');
win.$ = Cypress.$;
cy.get('h2')
.should($el => {
expect($el).to.have.text('dress') // passes
})
})
Код сброса может быть включен в переписать команду cy.visit()
, чтобы сделать ее менее распространенной.
Cypress.Commands.overwrite('visit', (originalFn, url, options) => {
return originalFn(url, options).then(_ => {
const win = cy.state('window')
win.$ = Cypress.$
})
})
...
it('title display', () => {
cy.visit('index.html')
cy.get('h2')
.should($el => {
expect($el).to.have.text('dress') // passes
})
})
NOTE Это влияет на способ z epto работает в приложении.
Обход, который оставляет функциональность Zepto
Эта версия перезаписи cy.visit()
оставит библиотеку Zepto функциональной, но позволит Нажмите на .should()
, чтобы получить правильный jQuery объект.
По сути, мы добавляем наш собственный прокси (поверх прокси zepto) и проверяем тип селектора при каждом вызове.
Cypress.Commands.overwrite('visit', (originalFn, url, options) => {
return originalFn(url, options).then(_ => {
const win = cy.state('window')
const zepto_$ = win.$;
win.$ = function(selector, context) {
return typeof selector === 'string'
? zepto_$(selector, context)
: Cypress.$(selector, context);
}
})
})
Используйте этот html фрагмент, чтобы проверить его. Если два журнала идентичны, zepto не затрагивается.
<body>
<h2>dress</h2>
<script src="https://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js"></script>
<script>
console.log('from app, call #1', $('h2'))
setTimeout(() => {
console.log('from app, call #2', $('h2'))
}, 1000)
</script>
</body>