setupJestEnv.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. expect.extend({
  2. toHaveBeenWarned(received: string) {
  3. asserted.add(received)
  4. const passed = warn.mock.calls.some(args => args[0].includes(received))
  5. if (passed) {
  6. return {
  7. pass: true,
  8. message: () => `expected "${received}" not to have been warned.`
  9. }
  10. } else {
  11. const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
  12. return {
  13. pass: false,
  14. message: () =>
  15. `expected "${received}" to have been warned` +
  16. (msgs.length
  17. ? `.\n\nActual messages:\n\n - ${msgs}`
  18. : ` but no warning was recorded.`)
  19. }
  20. }
  21. },
  22. toHaveBeenWarnedLast(received: string) {
  23. asserted.add(received)
  24. const passed =
  25. warn.mock.calls[warn.mock.calls.length - 1][0].includes(received)
  26. if (passed) {
  27. return {
  28. pass: true,
  29. message: () => `expected "${received}" not to have been warned last.`
  30. }
  31. } else {
  32. const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
  33. return {
  34. pass: false,
  35. message: () =>
  36. `expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}`
  37. }
  38. }
  39. },
  40. toHaveBeenWarnedTimes(received: string, n: number) {
  41. asserted.add(received)
  42. let found = 0
  43. warn.mock.calls.forEach(args => {
  44. if (args[0].includes(received)) {
  45. found++
  46. }
  47. })
  48. if (found === n) {
  49. return {
  50. pass: true,
  51. message: () => `expected "${received}" to have been warned ${n} times.`
  52. }
  53. } else {
  54. return {
  55. pass: false,
  56. message: () =>
  57. `expected "${received}" to have been warned ${n} times but got ${found}.`
  58. }
  59. }
  60. }
  61. })
  62. let warn: jest.SpyInstance
  63. const asserted: Set<string> = new Set()
  64. beforeEach(() => {
  65. asserted.clear()
  66. warn = jest.spyOn(console, 'warn')
  67. warn.mockImplementation(() => {})
  68. })
  69. afterEach(() => {
  70. const assertedArray = Array.from(asserted)
  71. const nonAssertedWarnings = warn.mock.calls
  72. .map(args => args[0])
  73. .filter(received => {
  74. return !assertedArray.some(assertedMsg => {
  75. return received.includes(assertedMsg)
  76. })
  77. })
  78. warn.mockRestore()
  79. if (nonAssertedWarnings.length) {
  80. throw new Error(
  81. `test case threw unexpected warnings:\n - ${nonAssertedWarnings.join(
  82. '\n - '
  83. )}`
  84. )
  85. }
  86. })