# Konfiguracja testowa

Tłumaczenia: [Français](https://github.com/avajs/ava-docs/blob/main/fr_FR/docs/recipes/test-setup.md)

Testy można skonfigurować za pomocą hooka `beforeEach()`. Często można zamiast tego użyć zwykłej funkcji konfiguracji. Ten przepis pomaga zdecydować, co najlepiej pasuje do Twojego przypadku użycia.

# Hook `beforeEach()` versus funkcje konfiguracji

Hook `beforeEach()` ma pewne wady. Na przykład nie można go wyłączyć dla określonych testów ani nie można zastosować do określonych testów. Alternatywnie możesz użyć prostych funkcji. Umożliwia to korzystanie z wielu funkcji konfiguracji dla różnych wymagań konfiguracji i wywoływanie różnych części konfiguracji z różnych testów. Możesz nawet mieć funkcje konfiguracji z parametrami, aby testy mogły dostosować własną konfigurację.

Załóżmy, że masz funkcję współdziałającą z systemem plików. Być może uruchamiasz kilka testów przy użyciu `mock-fs`, a następnie kilka, które korzystają z prawdziwego systemu plików i katalogu tymczasowego. Lub masz funkcję instalacyjną uruchamianą z poprawnymi danymi dla niektórych testów i niepoprawnymi danymi dla innych testów, wszystkie w tym samym pliku testowym.

Możesz zrobić wszystkie te rzeczy za pomocą zwykłych funkcji konfiguracji, ale są pewne kompromisy:

|`beforeEach()`| Setup functions
|---|---
| ⛔️   used for all tests| ✅   can change or skip depending on test
| ⛔️   more overhead for beginners, "some magic"| ✅   easier for beginners, "no magic"
| ✅   supports callback mode, built-in support for observables| ⛔️   must use promises for asynchronous behavior
| ✅   failure has friendly output| ⛔️   errors are attributed to the test
| ✅   corresponding `afterEach` and `afterEach.always` for cleanup| ⛔️   cannot easily clean up

## Kompleksowa konfiguracja testu

W tym przykładzie mamy oba hooki `beforeEach()`, a następnie kolejne modyfikacje w ramach każdego testu.

```js
test.beforeEach(t => {
	setupConditionA(t);
	setupConditionB(t);
	setupConditionC(t);
});

test('first scenario', t => {
	tweakSomething(t);
	const someCondition = t.context.thingUnderTest();
	t.true(someCondition);
});

test('second scenario', t => {
	tweakSomethingElse(t);
	const someOtherCondition = t.context.thingUnderTest();
	t.true(someOtherCondition);
});
```

Jeśli dla każdego testu trzeba zmienić zbyt wiele zmiennych, rozważ pominięcie opcji hook `beforeEach()` i przeprowadzanie kroków konfiguracji w ramach samych testów.

```js
test('first scenario', t => {
	setupConditionA(t);
	setupConditionB(t, {/* options */});
	setupConditionC(t);
	const someCondition = t.context.thingUnderTest();
	t.true(someCondition);
});

// In this test, setupConditionB() is never called.
test('second scenario', t => {
	setupConditionA(t);
	setupConditionC(t);
	const someOtherCondition = t.context.thingUnderTest();
	t.true(someOtherCondition);
});
```

## Praktyczny przykład

```js
test.beforeEach(t => {
	t.context = {
		authenticator: new Authenticator(),
		credentials: new Credentials('admin', 's3cr3t')
	};
});

test('authenticating with valid credentials', async t => {
	const isValid = t.context.authenticator.authenticate(t.context.credentials);
	t.true(await isValid);
});

test('authenticating with an invalid username', async t => {
	t.context.credentials.username = 'bad_username';
	const isValid = t.context.authenticator.authenticate(t.context.credentials);
	t.false(await isValid);
});

test('authenticating with an invalid password', async t => {
	t.context.credentials.password = 'bad_password';
	const isValid = t.context.authenticator.authenticate(t.context.credentials);
	t.false(await isValid);
});
```

Te same testy, teraz korzystające z funkcji instalacyjnych, wyglądałyby następująco.

```js
function setup({username = 'admin', password = 's3cr3t'} = {}) {
	return {
		authenticator: new Authenticator(),
		credentials: new Credentials(username, password)
	};
}

test('authenticating with valid credentials', async t => {
	const {authenticator, credentials} = setup();
	const isValid = authenticator.authenticate(credentials);
	t.true(await isValid);
});

test('authenticating with an invalid username', async t => {
	const {authenticator, credentials} = setup({username: 'bad_username'});
	const isValid = authenticator.authenticate(credentials);
	t.false(await isValid);
});

test('authenticating with an invalid password', async t => {
	const {authenticator, credentials} = setup({password: 'bad_password'});
	const isValid = authenticator.authenticate(credentials);
	t.false(await isValid);
});
```

## Łączenie hooków i funkcji konfiguracji

Oczywiście `beforeEach()` i funkcje zwykłej konfiguracji mogą być używane razem:

```js
test.beforeEach(t => {
	t.context = setupAllTests();
});

test('first scenario', t => {
	firstSetup(t);
	const someCondition = t.context.thingUnderTest();
	t.true(someCondition);
});
```