## TL;DR
When a before-all hook fails, Cypress reports the hook failure and hides the original error: the message tells you where it happened but not what happened. The fix is to get the hook's work out of the hook temporarily. Extract the hook body into a standalone script or spec, add logging around each step, read the browser console output in the CI artifacts, and fix the underlying failure rather than the hook wrapper.

## The query
```text
cypress Because this error occurred during a 'before all' hook  -  how to get the real error
```

## Use this when
- the output says Because this error occurred during a 'before all' hook
- the real error message is missing from the CI log
- the hook does setup work: seeding, login, or navigation

## Not for
- the hook times out (that is a timeout problem; the cause is usually visible)
- the failure is in a test body, not a hook
- beforeEach hooks fail (same technique applies, but the message differs)

## Steps

### 1. Extract the hook body into a runnable spec
Copy the before hook's steps into a temporary it() block so Cypress reports the real error against a test instead of swallowing it in the hook.
```js
// debug-hook.cy.js (temporary)
it('reproduces the before hook', () => {
  cy.request('POST', '/api/test-setup', { scenario: 'orders' });
  cy.visit('/orders');
  cy.get('[data-testid=order-row]').should('exist');
});
```
Expected output: the temporary spec fails with the real, unsuppressed error message.

### 2. Add logging inside the original hook
If extraction is impractical, log each step of the hook so the CI output shows how far it got.
```js
before(() => {
  cy.log('seeding database');
  cy.task('seedDatabase').then(() => cy.log('seed done'));
  cy.log('visiting app');
  cy.visit('/');
});
```
Expected output: the CI log shows the last completed step, narrowing the failure to one operation.

### 3. Read the browser console in the CI artifacts
The video and any console capture show what the application was doing when the hook failed: failed requests, JS errors, blank pages.
```bash
npx cypress run --spec cypress/e2e/orders.cy.js
# then inspect the video artifact around the hook phase
```
Expected output: the app-side error (a 500, a JS exception, a hanging request) is visible.

### 4. Fix the root cause and delete the scaffolding
Fix whatever the real error turned out to be, remove the temporary spec and the extra logging, and rerun the original suite.
```bash
rm cypress/e2e/debug-hook.cy.js
npx cypress run --spec cypress/e2e/orders.cy.js
```
Expected output: the before hook passes and the suite runs without debug scaffolding.

## Tool compatibility
- Cypress 10 - 14
- any browser Cypress supports

## Variant phrasings
- Because this error occurred during a 'before all' hook
- cypress before all hook failed no error message
- get the real error from cypress before hook failure

## Why it happens
Cypress attributes hook failures to the hook itself and, for before-all hooks, does not re-run the remaining tests, so it summarizes rather than details. The underlying error still occurred in the browser or in a task, which means it is recoverable by reproducing the hook's steps outside the hook where Cypress's reporting is complete.

## Edge cases / pitfalls
- an async hook that neither returns the chain nor awaits it fails mysteriously; always return cy.* chains from hooks
- login inside a before hook is better expressed as cy.session(), which has its own validation and error reporting
- a hook that fails only with CI data usually means the seed data or the fixture differs; diff the seed, not the hook
- cy.task failures inside hooks surface the task's error, but only if the task rejects properly; unhandled task errors look like hook mysteries

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_HDvAGGk9zOFdP8ze9LerLw
