在cypress.io

时间:2018-02-02 08:38:01

标签: javascript angularjs testing mocha cypress

我正在尝试使用cypress来测试我构建的大角度应用。我的要求是我将一个期望文件加载到我的测试中,然后将测试从期望文件中删除。

到目前为止,我无法使用cy.readFile()cy.fixture()甚至axios的各种组合来通过http加载文件来实现此功能。

问题似乎是我无法在it()之外使用这些方法,如果我不能这样做,则意味着我无法循环数据来创建它的。我正在尝试做类似下面的事情......这在柏树中甚至可能吗?我错过了一些明显的东西吗?

让我们说我的期​​望是这样的:

{
    "mainPage": [1, 2, 3],
    "otherPage": [4, 5, 6]
}

我希望我的代码加载它并浏览各个页面:

describe(`Test the app `, function() {
    cy.readFile("path/to/expectation.json").then(function(expectation) {
        Object.keys(expectation).forEach(function(pageName) {
            it(`for page ${pageName}`, function() {
                gotoPage(pageName);
                var pageData = getDataFrompage();
                expect(pageData).to.equal(expectation[pageName]);
            })
        })
    })
})

在我看来,这似乎是一个非常明显的用例,所以我很困惑为什么它看起来很难:)

2 个答案:

答案 0 :(得分:1)

我有类似的要求,除了我正在阅读应用程序配置文件(它位于app assets文件夹中)。

我用require这样看,

const runtimeConfig = require('../../../src/data/my-config');

这很好用,然后我可以根据文件内容进行测试。

所以,你的代码就是这样的

const expectation = require('path/to/expectation.json');

describe(`Test the app `, function() {
  Object.keys(expectation).forEach(function(pageName) {
    it(`for page ${pageName}`, function() {
      gotoPage(pageName);
      var pageData = getDataFrompage();
      expect(pageData).to.equal(expectation[pageName]);
    })
  })
})

readFile()

尝试cy.readFile(),您会收到此错误消息

  

未捕获错误:无法调用" cy.readFile()"在跑步测试之外。

您可以通过将读取包装在before中来阻止此错误

let runtimeConfig;
before(function(){
  cy.readFile('./src/data/my-config.json').then( fileContents => {
    runtimeConfig = fileContents;
  })
})

但遗憾的是赛普拉斯并没有等到读完成再继续测试。

fixture()

我还尝试了 example.spec.js

中显示的灯具模式
context('Files', function(){
  beforeEach(function(){
    cy.visit('https://example.cypress.io/commands/files')
  })
  it('cy.fixture() - load a fixture', function(){
    // Instead of writing a response inline you can
    // connect a response with a fixture file
    // located in fixtures folder.

    cy.server()

    // https://on.cypress.io/fixture
    cy.fixture('example.json').as('comment')

    cy.route(/comments/, '@comment').as('getComment')

    // we have code that gets a comment when
    // the button is clicked in scripts.js
    cy.get('.fixture-btn').click()

    cy.wait('@getComment').its('responseBody')
      .should('have.property', 'name')
      .and('include', 'Using fixtures to represent data')

但即使将其复制到/cypress/fixtures文件夹,也无法使用我的配置文件。

此外,这感觉非常hacky - 如果我正确理解这段代码,它会将文件读取变为伪路由导航,以便赛普拉斯可以等待它。

这种模式很复杂,当然不适合您描述的动态测试场景。

答案 1 :(得分:0)

  1. 假设您在Expectation.json文件中具有以下数据。
    {
      "mainPage": [1, 2, 3],
      "otherPage": [4, 5, 6]
    }
    

然后您的代码将像这样来动态创建测试用例

const data = require("path/to/expectation.json");

describe('Test the app', function() {
   Object.keys(data).forEach(function(page, i){
      it(`Test Case For: ${page}`, function() {
        cy.log(data[page])
      })
   })
})

See Output Below