我很困惑赛普拉斯如何将测试会话清除为空白页,和/或如何testIsolation:false工作。Cypress 允许可重用的测试命令和会话,如下所示:
Cypress.Commands.add('signin', (email, password) => {
cy.session([email, password], () => {
cy.visit('/'); // ???
cy.get('[data-test=signin-input-email]').type(email);
cy.get('[data-test=signin-input-password]').type(password);
cy.get('[data-test=signin-submit]').click();
// Assert successful login
cy.get('[data-test=auth-card').contains(email);
});
});
Run Code Online (Sandbox Code Playgroud)
在测试中使用这样的命令/会话时,会出现一些意外的行为。例如,下面的测试会出错,因为“导航到 about:blank 已清除页面”;但为什么当它被编程时会这样做呢cy.visit('/')?
describe('signin', () => {
it('submits signin form with valid data', () => {
cy.signin('valid.email@example.com', 'validpassword123');
// Assert successful login
cy.get('[data-test=auth-card').contains('Valid Email');
});
it('signs out', () => {
cy.signin('valid.email@example.com', 'validpassword123');
cy.get('[data-test=auth-menu]').click();
cy.contains('Sign out').click();
cy.get('[data-test=signin-input-email]').should('exist');
});
});
Run Code Online (Sandbox Code Playgroud)
此外,如果我修改测试以使用该{ testIsolation: false }选项,第二个测试将失败,因为未执行登录。我怎样才能更好地编写这些命令或测试以获得预期的行为?
问题是只运行一次cy.session()设置回调(即包含 的代码块)。cy.visit()
在第二次调用时,它只是将令牌从缓存恢复到 cookie(或本地存储或会话数据)。
因此,在测试隔离开启的情况下
第一次测试
cy.session()cy.visit()cy.get('[data-test=signin-submit]').click()重定向的地方第二次测试
about/blank以清除整个页面cy.session()所以 - 在第二、第三、第四次测试中,您应该在调用后导航cy.session()
在哪里调用 cy.visit()部分对此进行了解释 -
const login = (name) => {
cy.session(name, () => {
cy.visit('/login')
cy.get('[data-test=name]').type(name)
cy.get('[data-test=password]').type('s3cr3t')
cy.get('#submit').click()
cy.url().should('contain', '/home')
})
// no visit here
}
describe('home page tests', () => {
beforeEach(() => {
login('user')
cy.visit('/home') // navigating from "about/blank" to "/home"
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |