我开始使用 cypress,我想做 2 个测试。如果我的 api 返回“false”,则验证显示的内容,如果我的 api 返回“true”,则验证屏幕上显示的内容。 我试着做一个像这样的简单测试:
context('contextTest', () => {
before(() => {
cy.waitLoading();
});
beforeEach(() => {});
it('false test', function() {
cy.intercept('POST', '**/test/alreadySent', {
fixture: 'test/alreadySent-false.json',
}).as('alreadySent');
cy.wait('@alreadySent');
cy.get('[data-cy=alreadysent-button]');
});
});
但是拦截不起作用,它总是返回真正的 api 调用。 奇怪的是,如果我只是将代码放在我的 before() 中,一切都可以正常工作。
context('contextTest', () => {
before(() => {
cy.intercept('POST', '**/test/alreadySent', {
fixture: 'test/alreadySent-false.json',
}).as('alreadySent');
cy.waitLoading();
});
beforeEach(() => {});
it('false test', function() {
cy.wait('@alreadySent');
cy.get('[data-cy=alreadysent-button]');
});
});
但是我需要更改下一个测试的截距,所以我想在这个测试中专门设置截距。
有没有可能,为什么我的第一个代码似乎不起作用? 或者我应该在另一个文件上编写下一个测试,而在同一个文件上进行这种验证是一种不好的做法?
答案 0 :(得分:2)
由于拦截在命令顺序中向上移动时它起作用,因此似乎cy.waitLoading()
触发了POST而不是cy.get('[data-cy=alreadysent-button]')
。
拦截必须始终在触发器(页面访问或按钮点击)之前设置。
但截距因测试而异,所以我会尝试设置一个在每个测试顶部调用的辅助函数,而不是 before()
。
const loadAndIntercept = (apiResult) => {
const apiFixture = apiResult ? 'test/alreadySent-true.json' : 'test/alreadySent-false.json';
cy.intercept('POST', '**/test/alreadySent', { fixture: apiFixture }).as('alreadySent');
cy.waitLoading();
})
it('false test', function() {
loadAndIntercept(false);
cy.wait('@alreadySent');
cy.get('[data-cy=alreadysent-button]');
});
it('true test', function() {
loadAndIntercept(true);
cy.wait('@alreadySent');
cy.get('[data-cy=alreadysent-button]');
});
这应该可以工作,因为在测试之间清除了拦截。参考 docs - intercept
<块引用>注意:每次测试前所有拦截都会自动清除。