جافاسكريبت - تشغيل الاختبارات على ملف ديناميكي في cypress.io
أحاول استخدام Cypress لاختبار تطبيق Angular كبير قد بنيته. متطلبي هو أن أقوم بتحميل ملف التوقعات في اختباري ثم أقود الاختبار استنادًا إلى هذا الملف.
حتى الآن لم أتمكن من جعل هذا يعمل باستخدام تركيبات متنوعة من cy.readFile()، cy.fixture()، وحتى axios لتحميل الملف عبر http.
يبدو أن المشكلة هي أنني لا أستطيع استخدام هذه الطرق خارج it() وإذا لم أستطع فعل ذلك فهذا يعني أنني لا أستطيع التكرار عبر البيانات لإنشاء الـ its. أحاول أن أفعل شيئًا مثل ما هو أدناه... هل هذا ممكن حتى في Cypress؟ هل أفوت شيئًا واضحًا؟
لنفترض أن توقعاتي تبدو هكذا:
{
"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]);
})
})
})
})
يبدو لي أن هذا حالة استخدام واضحة جدًا لذا أنا مرتبك لماذا يبدو أنه صعب جدًا :)
الإجابة رقم 1
لديّ متطلب مشابه، باستثناء أنني أقوم بقراءة ملف تكوين التطبيق (الذي يوجد داخل مجلد أصول التطبيق).
قرأت ذلك باستخدام 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]);
})
})
})
قراءة_الملف()
عند محاولة cy.readFile()، تحصل على رسالة الخطأ هذه
خطأ غير ملتقط: لا يمكن استدعاء "cy.readFile()" خارج اختبار جارٍ.
يمكنك إيقاف هذا الخطأ عن طريق تغليف عملية القراءة في before كما يلي
let runtimeConfig;
before(function(){
cy.readFile('./src/data/my-config.json').then( fileContents => {
runtimeConfig = fileContents;
})
})
لكن للأسف، لا تنتظر Cypress اكتمال القراءة قبل المتابعة إلى الاختبار.
تجهيز()
لقد جربت أيضًا نمط التجهيز الموضح في 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.
أيضًا، هذا يبدو أمرًا تقريبيًا جدًا - إذا فهمت هذا الكود بشكل صحيح، فإنه يحول قراءة الملف إلى تنقل شبه مسار حتى يتمكن Cypress من الانتظار عليه.
هذا النمط معقد وبالتأكيد لا يناسب سيناريو الاختبار الديناميكي الذي تصفه.
الإجابة رقم 2
افترض أن لديك البيانات التالية في ملف 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])
})
})
})
