From 6ed647f380fc96c1ffbee8db220e0cd7f701b37a Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Fri, 27 May 2022 00:25:40 +0800 Subject: [PATCH 1/7] change message when toBe is failed but object comparisons is successful --- .../src/integrations/chai/jest-expect.ts | 33 +++++++++++++++++-- test/core/test/jest-expect.test.ts | 15 +++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index ca1858721cae..672947cad35f 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -129,10 +129,37 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { }) def('toBe', function (expected) { const actual = this._obj + const equal = Object.is(actual, expected) + + let toBeMessage = 'expected #{this} to be #{exp} // Object.is equality' + let notToBeMessage = 'expected #{this} not to be #{exp} // Object.is equality' + if (!equal) { + const objectEqual = jestEquals( + actual, + expected, + [iterableEquality], + ) || jestEquals( + actual, + expected, + [ + iterableEquality, + typeEquality, + sparseArrayEquality, + arrayBufferEquality, + ], + true, + ) + + if (objectEqual) { + toBeMessage = 'expected #{this} to be [serializes to the same string] // Object.is equality' + notToBeMessage = 'expected #{this} to not be #{exp} // Object.is equality' + } + } + return this.assert( - Object.is(actual, expected), - 'expected #{this} to be #{exp} // Object.is equality', - 'expected #{this} not to be #{exp} // Object.is equality', + equal, + toBeMessage, + notToBeMessage, expected, actual, ) diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 7c150c8f8c2c..5ac7edf0b158 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -1,5 +1,6 @@ /* eslint-disable comma-spacing */ /* eslint-disable no-sparse-arrays */ +import { AssertionError } from 'assert' import { describe, expect, it, vi } from 'vitest' class TestError extends Error {} @@ -549,6 +550,20 @@ describe('async expect', () => { expect(error).toEqual(expectedError) } }) + + it('show users message `[serializes to the same string]` if they are comparing objects', () => { + const actual = { key: 'value' } + const expectedError = new AssertionError({ + message: 'expected { key: \'value\' } to be [serializes to the same string] // Object.is equality', + }) + + try { + expect(actual).toBe({ ...actual }) + } + catch (error) { + expect(error).toEqual(expectedError) + } + }) }) it('timeout', () => new Promise(resolve => setTimeout(resolve, 500))) From f465ee408d520587cefbf2c3f527fea1d4b3eee2 Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Fri, 27 May 2022 12:09:51 +0800 Subject: [PATCH 2/7] provide details in the message --- .../src/integrations/chai/jest-expect.ts | 36 +++++++++++----- test/core/test/jest-expect.test.ts | 42 ++++++++++++++++--- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 672947cad35f..e8771b743b01 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -129,16 +129,13 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { }) def('toBe', function (expected) { const actual = this._obj - const equal = Object.is(actual, expected) + const pass = Object.is(actual, expected) let toBeMessage = 'expected #{this} to be #{exp} // Object.is equality' let notToBeMessage = 'expected #{this} not to be #{exp} // Object.is equality' - if (!equal) { - const objectEqual = jestEquals( - actual, - expected, - [iterableEquality], - ) || jestEquals( + if (!pass) { + let deepEqualityName = 'toStrictEqual' + const toStrictEqualPass = jestEquals( actual, expected, [ @@ -150,14 +147,31 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { true, ) - if (objectEqual) { - toBeMessage = 'expected #{this} to be [serializes to the same string] // Object.is equality' - notToBeMessage = 'expected #{this} to not be #{exp} // Object.is equality' + if (toStrictEqualPass) { + const reminderMessage = `If it should pass with deep equality, replace "toBe" with "${deepEqualityName}"\n\n` + + toBeMessage = `${reminderMessage}expected #{this} to be [serializes to the same string] // Object.is equality` + notToBeMessage = `${reminderMessage}expected #{this} not to be [serializes to the same string] // Object.is equality` + } + else { + const toEqualPass = jestEquals( + actual, + expected, + [iterableEquality], + ) + + if (toEqualPass) { + deepEqualityName = 'toEqual' + const reminderMessage = `If it should pass with deep equality, replace "toBe" with "${deepEqualityName}"\n\n` + + toBeMessage = `${reminderMessage}expected #{this} to be [serializes to the same string] // Object.is equality` + notToBeMessage = `${reminderMessage}expected #{this} not to be [serializes to the same string] // Object.is equality` + } } } return this.assert( - equal, + pass, toBeMessage, notToBeMessage, expected, diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 5ac7edf0b158..1427538fb062 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -551,17 +551,49 @@ describe('async expect', () => { } }) - it('show users message `[serializes to the same string]` if they are comparing objects', () => { - const actual = { key: 'value' } - const expectedError = new AssertionError({ - message: 'expected { key: \'value\' } to be [serializes to the same string] // Object.is equality', + it('reminds users to use deep equality checks if they are comparing objects', () => { + const createAssertionError = ( + deepEqualityName: string, + expected: string, + ) => new AssertionError({ + message: 'If it should pass with deep equality, ' + + `replace "toBe" with "${deepEqualityName}"\n\nexpected ${expected} ` + + 'to be [serializes to the same string] // Object.is equality', }) + const actual = { key: 'value' } + class FakeClass {} + + const toStrictEqualError1 = createAssertionError('toStrictEqual', '{ key: \'value\' }') try { expect(actual).toBe({ ...actual }) } catch (error) { - expect(error).toEqual(expectedError) + expect(error).toEqual(toStrictEqualError1) + } + + const toStrictEqualError2 = createAssertionError('toStrictEqual', 'FakeClass{}') + try { + expect(new FakeClass()).toBe(new FakeClass()) + } + catch (error) { + expect(error).toEqual(toStrictEqualError2) + } + + const toEqualError1 = createAssertionError('toEqual', '{}') + try { + expect({}).toBe(new FakeClass()) + } + catch (error) { + expect(error).toEqual(toEqualError1) + } + + const toEqualError2 = createAssertionError('toEqual', 'FakeClass{}') + try { + expect(new FakeClass()).toBe({}) + } + catch (error) { + expect(error).toEqual(toEqualError2) } }) }) From 81a509d5ccf0a262b561d00ce5acfc77cc7ae240 Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Fri, 27 May 2022 12:24:09 +0800 Subject: [PATCH 3/7] simplify logic for toBeMessage --- packages/vitest/src/integrations/chai/jest-expect.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index e8771b743b01..4db4cc995d0e 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -132,9 +132,8 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { const pass = Object.is(actual, expected) let toBeMessage = 'expected #{this} to be #{exp} // Object.is equality' - let notToBeMessage = 'expected #{this} not to be #{exp} // Object.is equality' if (!pass) { - let deepEqualityName = 'toStrictEqual' + let reminderMessage = 'If it should pass with deep equality, replace "toBe" with "toStrictEqual"\n\n' const toStrictEqualPass = jestEquals( actual, expected, @@ -148,10 +147,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { ) if (toStrictEqualPass) { - const reminderMessage = `If it should pass with deep equality, replace "toBe" with "${deepEqualityName}"\n\n` - toBeMessage = `${reminderMessage}expected #{this} to be [serializes to the same string] // Object.is equality` - notToBeMessage = `${reminderMessage}expected #{this} not to be [serializes to the same string] // Object.is equality` } else { const toEqualPass = jestEquals( @@ -161,11 +157,9 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { ) if (toEqualPass) { - deepEqualityName = 'toEqual' - const reminderMessage = `If it should pass with deep equality, replace "toBe" with "${deepEqualityName}"\n\n` + reminderMessage = 'If it should pass with deep equality, replace "toBe" with "toEqual"\n\n' toBeMessage = `${reminderMessage}expected #{this} to be [serializes to the same string] // Object.is equality` - notToBeMessage = `${reminderMessage}expected #{this} not to be [serializes to the same string] // Object.is equality` } } } @@ -173,7 +167,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { return this.assert( pass, toBeMessage, - notToBeMessage, + 'expected #{this} not to be #{exp} // Object.is equality', expected, actual, ) From f443e976182d9c6d6f34e5d54ba91c3c8390d94a Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Fri, 27 May 2022 12:34:07 +0800 Subject: [PATCH 4/7] empty commit to trigger ci again From 9cc61ea2bdba3ed7cab1a93bb9020ed98e8356c9 Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Thu, 2 Jun 2022 01:03:52 +0800 Subject: [PATCH 5/7] change error message & the related test --- .../vitest/src/integrations/chai/jest-expect.ts | 17 +++++++---------- .../vitest/src/integrations/chai/jest-utils.ts | 13 +++++++++++++ test/core/test/jest-expect.test.ts | 17 +++++++++-------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 4db4cc995d0e..78a008ab4b00 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -7,7 +7,7 @@ import type { Constructable, Test } from '../../types' import { assertTypes } from '../../utils' import { unifiedDiff } from '../../node/diff' import type { ChaiPlugin, MatcherState } from '../../types/chai' -import { arrayBufferEquality, iterableEquality, equals as jestEquals, sparseArrayEquality, subsetEquality, typeEquality } from './jest-utils' +import { arrayBufferEquality, iterableEquality, equals as jestEquals, sparseArrayEquality, subsetEquality, typeEquality, generateToBeMessage } from './jest-utils' import type { AsymmetricMatcher } from './jest-asymmetric-matchers' import { stringify } from './jest-matcher-utils' @@ -131,9 +131,9 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { const actual = this._obj const pass = Object.is(actual, expected) - let toBeMessage = 'expected #{this} to be #{exp} // Object.is equality' + let deepEqualityName = ''; + if (!pass) { - let reminderMessage = 'If it should pass with deep equality, replace "toBe" with "toStrictEqual"\n\n' const toStrictEqualPass = jestEquals( actual, expected, @@ -147,7 +147,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { ) if (toStrictEqualPass) { - toBeMessage = `${reminderMessage}expected #{this} to be [serializes to the same string] // Object.is equality` + deepEqualityName = 'toStrictEqual' } else { const toEqualPass = jestEquals( @@ -156,17 +156,14 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { [iterableEquality], ) - if (toEqualPass) { - reminderMessage = 'If it should pass with deep equality, replace "toBe" with "toEqual"\n\n' - - toBeMessage = `${reminderMessage}expected #{this} to be [serializes to the same string] // Object.is equality` - } + if (toEqualPass) + deepEqualityName = 'toEqual' } } return this.assert( pass, - toBeMessage, + generateToBeMessage(deepEqualityName), 'expected #{this} not to be #{exp} // Object.is equality', expected, actual, diff --git a/packages/vitest/src/integrations/chai/jest-utils.ts b/packages/vitest/src/integrations/chai/jest-utils.ts index 9e4887133ecb..142d13d4dca1 100644 --- a/packages/vitest/src/integrations/chai/jest-utils.ts +++ b/packages/vitest/src/integrations/chai/jest-utils.ts @@ -508,3 +508,16 @@ export const sparseArrayEquality = ( equals(a, b, [iterableEquality, typeEquality], true) && equals(aKeys, bKeys) ) } + +export const generateToBeMessage = ( + deepEqualityName: string, + expected = '#{this}', + actual = '#{exp}', +) => { + const toBeMessage = `expected ${expected} to be ${actual} // Object.is equality` + + if (['toStrictEqual', 'toEqual'].includes(deepEqualityName)) + return `${toBeMessage}\n\nIf it should pass with deep equality, replace "toBe" with "${deepEqualityName}"\n\nExpected: ${expected}\nReceived: serializes to the same string\n` + + return toBeMessage +} diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 1427538fb062..21ec53d3eb7c 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -2,6 +2,7 @@ /* eslint-disable no-sparse-arrays */ import { AssertionError } from 'assert' import { describe, expect, it, vi } from 'vitest' +import { generateToBeMessage } from 'vitest/src/integrations/chai/jest-utils' class TestError extends Error {} @@ -552,19 +553,18 @@ describe('async expect', () => { }) it('reminds users to use deep equality checks if they are comparing objects', () => { - const createAssertionError = ( + const generatedToBeMessage = ( deepEqualityName: string, expected: string, + actual: string, ) => new AssertionError({ - message: 'If it should pass with deep equality, ' - + `replace "toBe" with "${deepEqualityName}"\n\nexpected ${expected} ` - + 'to be [serializes to the same string] // Object.is equality', + message: generateToBeMessage(deepEqualityName, expected, actual), }) const actual = { key: 'value' } class FakeClass {} - const toStrictEqualError1 = createAssertionError('toStrictEqual', '{ key: \'value\' }') + const toStrictEqualError1 = generatedToBeMessage('toStrictEqual', '{ key: \'value\' }', '{ key: \'value\' }') try { expect(actual).toBe({ ...actual }) } @@ -572,7 +572,7 @@ describe('async expect', () => { expect(error).toEqual(toStrictEqualError1) } - const toStrictEqualError2 = createAssertionError('toStrictEqual', 'FakeClass{}') + const toStrictEqualError2 = generatedToBeMessage('toStrictEqual', 'FakeClass{}', 'FakeClass{}') try { expect(new FakeClass()).toBe(new FakeClass()) } @@ -580,15 +580,16 @@ describe('async expect', () => { expect(error).toEqual(toStrictEqualError2) } - const toEqualError1 = createAssertionError('toEqual', '{}') + const toEqualError1 = generatedToBeMessage('toEqual', '{}', 'FakeClass{}') try { expect({}).toBe(new FakeClass()) } catch (error) { expect(error).toEqual(toEqualError1) + // expect(error).toEqual('1234') } - const toEqualError2 = createAssertionError('toEqual', 'FakeClass{}') + const toEqualError2 = generatedToBeMessage('toEqual', 'FakeClass{}', '{}') try { expect(new FakeClass()).toBe({}) } From e6cef4a84da36bc1a148f680a89bd4018e197865 Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Thu, 2 Jun 2022 01:09:59 +0800 Subject: [PATCH 6/7] fix lint error --- packages/vitest/src/integrations/chai/jest-expect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 78a008ab4b00..8371cf243773 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -7,7 +7,7 @@ import type { Constructable, Test } from '../../types' import { assertTypes } from '../../utils' import { unifiedDiff } from '../../node/diff' import type { ChaiPlugin, MatcherState } from '../../types/chai' -import { arrayBufferEquality, iterableEquality, equals as jestEquals, sparseArrayEquality, subsetEquality, typeEquality, generateToBeMessage } from './jest-utils' +import { arrayBufferEquality, generateToBeMessage, iterableEquality, equals as jestEquals, sparseArrayEquality, subsetEquality, typeEquality } from './jest-utils' import type { AsymmetricMatcher } from './jest-asymmetric-matchers' import { stringify } from './jest-matcher-utils' From 368e204a2550fcf12a4cf1671bd072b34d432532 Mon Sep 17 00:00:00 2001 From: TommyDew42 Date: Thu, 2 Jun 2022 01:17:00 +0800 Subject: [PATCH 7/7] fix lint error again --- packages/vitest/src/integrations/chai/jest-expect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 8371cf243773..177f1c06d76f 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -131,7 +131,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { const actual = this._obj const pass = Object.is(actual, expected) - let deepEqualityName = ''; + let deepEqualityName = '' if (!pass) { const toStrictEqualPass = jestEquals(