我正在尝试使用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]);
})
})
})
})
在我看来,这似乎是一个非常明显的用例,所以我很困惑为什么它看起来很难:)
答案 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)
{ "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])
})
})
})