我们如何调用与赛普拉斯测试分开的文件中编写的函数?

时间:2018-08-13 11:55:16

标签: javascript cypress

在Cypress.io测试中,我正在调用减法函数并以“ example-spec”形式编写测试,如下所示。一切正常。但是我们如何调用在不同js文件中编写的相同减法函数,例如Cypress测试中的'/basetest.js'?

describe ('Calling a function', function(){
it('Call the Subtract function and asert the calculation', function(){
    cy
    .wrap({sub: subValues})
    .invoke('sub', 15, 8)
    .should('eq', 7) // true        
    })

})

//减函数:

const subValues = (a, b) => {
  return a - b 
}

3 个答案:

答案 0 :(得分:5)

将新文件添加到cypress/support/,例如cypress/support/functions.js

cy.myproject = {
    makeUniqueUsername: () => {
        return 'cypress-test-' + Cypress.moment().format("YYMMDD-HHmmss");
    }
}

通过在cypress/support/index.js中添加对它的引用来包含它

import './functions'

然后从任何测试中调用函数

describe('registration', function() {
    it('can register', function() {
        let username = cy.myproject.makeUniqueUsername();
        cy.visit('/register');
        cy.get('#username').type(username);
        // etc...
    })
});

在考虑普通函数而不是赛普拉斯的“自定义命令”时,请注意cypress documentation encourage plain functions where custom commands aren't necessary in single spec files,尽管我不同意它们不应该干燥测试代码。


感谢其他答案,让我明白了这一点。 主要的补充是逐步实现它,并将自定义函数保留在全局cy.*命名空间之外。


注意:通过这种方式(与通过Cypress.Commands.add注册命令相反),您会失去Cypress UI中的日志记录和时间旅行。 (感谢@conny)。取决于您和您的团队,您对每种情况,使用显式js的明确步骤或IDE / linter / etc支持的价值都更高。注册命令使其成为测试中的明确步骤,而不仅仅是支持功能。

答案 1 :(得分:4)

来自https://docs.cypress.io/api/cypress-api/custom-commands.html

将此内容放入您的support/commands.js文件中:

Cypress.Commands.add('subValues', (a, b) => { return a - b });

将此文件放置在您的support/index.js文件中(如果尚未存在)(应该存在):

import "./commands";

像这样在测试中调用它:

describe ('Calling a function', function(){
  it('Call the Subtract function and asert the calculation', function(){
    cy
      .subValues(15, 8)
      .should('eq', 7) // true        
    });
});

答案 2 :(得分:1)

Cypress包含一个外部库文件,默认情况下位于(path to project)/support/index.js

此文件包含在所有测试文件中,因此您可以在此处放置共享代码。


您还可以在support中使用以下代码在index.js文件夹中包含其他文件:

import './MySupportFile.js'

当包含一个外部测试文件时,简单的函数定义似乎不会继续存在。我不确定为什么。将功能插入cy对象对我来说是有效的:

cy.myFunction = greeting => {
    console.log(greeting);
};

cy.myNamespace = {};

cy.myNamespace.myNamespacedFunction = () => {
    console.log("hi");
};

cy对象中的这些函数将继承到您拥有的任何/integration文件中。