====== Mockování v .NET (Moq, NSubstitute) ======
**Mockování** je technika v [[it:sw:unit_testing|jednotkovém testování]], která umožňuje nahradit reálné, složité objekty (závislosti) jejich zjednodušenými simulacemi. To je nezbytné pro izolaci testovaného kódu od externích vlivů, jako jsou databáze, API nebo souborový systém.
===== 1. Proč mockovat? =====
Bez mockování by unit testy nebyly izolované. Pokud testovaná metoda volá databázi, test by mohl selhat kvůli výpadku sítě, nikoliv kvůli chybě v logice.
* **Rychlost:** Mocky existují pouze v paměti, nevykonávají žádné náročné operace.
* **Předvídatelnost:** Mocku můžete přikázat, co přesně má vrátit (např. simulovat chybu nebo prázdný seznam).
* **Zaměření:** Testujete pouze logiku dané třídy, nikoliv integritu celého systému.
---
===== 2. Moq: Standard v .NET světě =====
**Moq** je nejrozšířenější knihovna pro mockování v .NET. Využívá silné typování a Lambda výrazy.
==== Příklad použití Moq ====
Předpokládejme, že testujeme službu, která potřebuje data z repozitáře.
// 1. Vytvoření mocku pro rozhraní
var mockRepo = new Mock();
// 2. Nastavení (Setup) - co má mock udělat
mockRepo.Setup(repo => repo.GetById(1)).Returns(new User { Name = "Jan" });
// 3. Použití mocku v testované službě
var service = new UserService(mockRepo.Object);
var result = service.GetUserName(1);
// 4. Ověření (Verify) - byla metoda skutečně zavolána?
mockRepo.Verify(repo => repo.GetById(1), Times.Once());
---
===== 3. NSubstitute: Elegantní alternativa =====
**NSubstitute** se zaměřuje na co nejjednodušší a nejčitelnější syntaxi. Často je preferován pro svou stručnost.
==== Příklad použití NSubstitute ====
Stejný scénář jako výše, ale s NSubstitute:
// 1. Vytvoření náhrady
var repo = Substitute.For();
// 2. Nastavení (Returns)
repo.GetById(1).Returns(new User { Name = "Jan" });
// 3. Akce
var service = new UserService(repo);
var result = service.GetUserName(1);
// 4. Ověření (Received)
repo.Received().GetById(1);
---
===== 4. Srovnání Moq a NSubstitute =====
^ Vlastnost ^ Moq ^ NSubstitute ^
| **Syntaxe** | Explicitní (.Setup, .Object) | Implicitní a velmi stručná |
| **Typování** | Silně typované (Lambda) | Silně typované (Extension metody) |
| **Čitelnost** | Trochu upovídanější | Velmi blízká přirozenému jazyku |
| **Učení** | Vyžaduje pochopení Mock | Intuitivní od prvního použití |
---
===== 5. Best Practices pro mockování =====
* **Mockujte pouze rozhraní (Interfaces):** Rozhraní jsou pro mockování ideální. Mockování konkrétních tříd vyžaduje virtuální metody a je složitější.
* **Nepřemockujte (Over-mocking):** Pokud mockujete úplně všechno, testujete pouze to, že jste správně nastavili mocky, nikoliv reálnou logiku.
* **Dodržujte DIP:** Mockování je možné pouze tehdy, pokud vaše třídy přijímají závislosti skrze konstruktor (Dependency Injection).
----
//Související články://
* [[it:sw:unit_testing|Unit Testing a kvalita kódu]]
* [[it:sw:xunit|xUnit.net Framework]]
* [[it:sw:solid|Principy SOLID (Dependency Inversion)]]
//Tagy: {{tag>programming dot-net testing mock moq nsubstitute csharp}}//