赛普拉斯是否支持软断言?

时间:2019-04-26 12:54:59

标签: cypress

赛普拉斯是否支持软断言?例如-我正在浏览'n'个元素,并想验证它们的值。如果任何元素的值不匹配,则测试将失败。它不会继续验证next元素的值。有没有办法验证所有元素的值并在最后显示失败的元素?

1 个答案:

答案 0 :(得分:1)

编辑:我可能会误解了..如果您是指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