Cypress поддерживает мягкое утверждение? - PullRequest
1 голос
/ 26 апреля 2019

Cypress поддерживает мягкое утверждение?Например, я перебираю n элементов и хочу проверить их значения.Если значение какого-либо элемента не соответствует, значит, тест не пройден.Он не продолжает проверять значение следующих элементов.Есть ли способ проверить все значения элементов и показать сбойные значения в конце?

1 Ответ

1 голос
/ 27 апреля 2019

РЕДАКТИРОВАТЬ: Я, вероятно, неправильно понял .. если вы имели в виду мягкие утверждения команд cy (не * chai expect / assert), то этот ответ не для вас.

WTBS, вы можете использовать приведенное ниже решение и сделать что-то вроде:

describe('test', () => {

    const { softExpect } = chai;

    it('test', () => {
        cy.document().then( doc => {
            doc.body.innerHTML = `
                <div class="test">1</div>
                <div class="test">2</div>
                <div class="test">3</div>
            `;
        });
        cy.get('.test').each( $elem => {
            softExpect($elem[0].textContent).to.eq('2');
        });
    });
});

Вы можете сделать что-то вроде этого.

support/index.js

let isSoftAssertion = false;
let errors = [];

chai.softExpect = function ( ...args ) {
    isSoftAssertion = true;
    return chai.expect(...args);
},
chai.softAssert = function ( ...args ) {
    isSoftAssertion = true;
    return chai.assert(...args);
}

const origAssert = chai.Assertion.prototype.assert;
chai.Assertion.prototype.assert = function (...args) {
    if ( isSoftAssertion ) {
        try {
            origAssert.call(this, ...args)
        } catch ( error ) {
            errors.push(error);
        }
        isSoftAssertion = false;
    } else {

        origAssert.call(this, ...args)
    }
};

// monkey-patch `Cypress.log` so that the last `cy.then()` isn't logged to command log
const origLog = Cypress.log;
Cypress.log = function ( data ) {
    if ( data && data.error && /soft assertions/i.test(data.error.message) ) {
        data.error.message = '\n\n\t' + data.error.message + '\n\n';
        throw data.error;
    }
    return origLog.call(Cypress, ...arguments);
};

// monkey-patch `it` callback so we insert `cy.then()` as a last command 
// to each test case where we'll assert if there are any soft assertion errors
function itCallback ( func ) {
    func();
    cy.then(() => {
        if ( errors.length ) {
            const _ = Cypress._;
            let msg = '';

            if ( Cypress.browser.isHeaded ) {

                msg = 'Failed soft assertions... check log above ↑';
            } else {

                _.each( errors, error => {
                    msg += '\n' + error;
                });

                msg = msg.replace(/^/gm, '\t');
            }

            throw new Error(msg);
        }
    });
}

const origIt = window.it;
window.it = (title, func) => {
    origIt(title, func && (() => itCallback(func)));
};
window.it.only = (title, func) => {
    origIt.only(title, func && (() => itCallback(func)));
};
window.it.skip = (title, func) => {
    origIt.skip(title, func);
};

beforeEach(() => {
    errors = [];
});
afterEach(() => {
    errors = [];
    isSoftAssertion = false;
});

А в вашей спецификации:

describe('test', () => {

    const { softAssert, softExpect } = chai;

    it('test', () => {
        cy.wrap([1, 42, 3]).then( vals => {
            vals.forEach( val => {
                softAssert(val === 42, `${val} should equal 42`);
            });
        });
    });

    it('test2', () => {
        cy.wrap([2, 5, 4]).then( vals => {
            vals.forEach( val => {
                softExpect(val).to.eq(42);
            });
        });
    });
});

Журнал кипариса:

enter image description here

Терминал (безголовый прогон):

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...