jga*_*fin 11 javascript cypress
我是 cypress 的新手,我正试图弄清楚事情是如何运作的。
我有自己的函数(调用测试控制器服务器来重置数据库)。它返回一个承诺,当数据库成功重置时完成。
function resetDatabase(){
// returns a promise for my REST api call.
}
Run Code Online (Sandbox Code Playgroud)
我的目标是能够在所有测试之前执行它。
describe('Account test suite', function () {
// how can I call resetDb here and wait for the result
// before the tests below are invoked?
it('can log in', function () {
cy.visit(Cypress.config().testServerUrl + '/Account/Login/')
cy.get('[name="UserName"]').type("admin");
cy.get('[name="Password"]').type("123456");
cy.get('#login-button').click();
});
// .. and more test
})
Run Code Online (Sandbox Code Playgroud)
我怎么能在柏树中做到这一点?
更新
我试过了
before(() => {
return resetDb(Cypress.config().apiServerUrl);
});
Run Code Online (Sandbox Code Playgroud)
但是后来我收到一条警告说:
赛普拉斯检测到您在测试中返回了一个承诺,但也在该承诺中调用了一个或多个 cy 命令
我不是cy在调用in resetDb()。
赛普拉斯有承诺(Cypress.Promise),但它们不是真正的承诺,更像是鸭子打字。事实上,Cypress 并非 100% 与真正的承诺兼容,它们可能有效,也可能无效。
将其Cypress.Promise视为任务或操作。它们与所有其他 cypress 命令一起顺序执行。
要使您的函数进入赛普拉斯管道,您可以使用自定义命令。文档没有说明,但你可以Cypress.Promise从他们那里返回一个。
Cypress.Commands.add('resetDb', function () {
var apiServerUrl = Cypress.config().apiServerUrl;
return new Cypress.Promise((resolve, reject) => {
httpRequest('PUT', apiServerUrl + "/api/test/reset/")
.then(function (data) {
resolve();
})
.catch(function (err) {
reject(err);
});
});
});
Run Code Online (Sandbox Code Playgroud)
然后可以从测试本身执行该命令,或者在我的情况下从before().
describe('Account', function () {
before(() => {
cy.resetDb();
});
it('can login', function () {
// test code
});
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8378 次 |
| 最近记录: |