diff --git a/lib/chai/core/assertions.js b/lib/chai/core/assertions.js index 82257f4c..7601c7c6 100644 --- a/lib/chai/core/assertions.js +++ b/lib/chai/core/assertions.js @@ -3282,6 +3282,8 @@ Assertion.addMethod('members', function (subset, msg) { let contains = flag(this, 'contains'); let ordered = flag(this, 'ordered'); + // Positional diffs mislead when deep comparison ignores order. + const showDiff = !flag(this, 'deep') || Boolean(ordered); let subject, failMsg, failNegateMsg; @@ -3304,7 +3306,7 @@ Assertion.addMethod('members', function (subset, msg) { failNegateMsg, subset, obj, - true + showDiff ); }); diff --git a/test/expect.js b/test/expect.js index 3d02cdf1..b0382d43 100644 --- a/test/expect.js +++ b/test/expect.js @@ -3518,6 +3518,26 @@ describe('expect', function () { expect([{ id: 1 }]).deep.members([{ id: 1 }]); expect([{a: 1}, {b: 2}, {b: 2}]).deep.members([{a: 1}, {b: 2}, {b: 2}]); + const actual = [{ foo: 'X' }, { foo: 'Y' }, { foo: 'Z' }, { foo: 'a' }]; + const expected = [{ foo: 'a' }, { foo: 'x' }, { foo: 'y' }, { foo: 'z' }]; + + let unorderedError; + try { + expect(actual).deep.members(expected); + } catch (error) { + unorderedError = error; + } + expect(unorderedError.message).to.include('to have the same members as'); + expect(unorderedError.showDiff).to.equal(false); + + err(function () { + expect([1, 2]).members([2, 3]); + }, { showDiff: true }); + + err(function () { + expect(actual).deep.ordered.members(expected); + }, { showDiff: true }); + expect([{ id: 2 }]).not.deep.members([{ id: 1 }]); expect([{a: 1}, {b: 2}]).not.deep.members([{a: 1}, {b: 2}, {b: 2}]); expect([{a: 1}, {b: 2}, {b: 2}]).not.deep.members([{a: 1}, {b: 2}]);