Mockování je technika v 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.
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.
—
Moq je nejrozšířenější knihovna pro mockování v .NET. Využívá silné typování a Lambda výrazy.
Předpokládejme, že testujeme službu, která potřebuje data z repozitáře.
// 1. Vytvoření mocku pro rozhraní
var mockRepo = new Mock<IUserRepository>();
// 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());
—
NSubstitute se zaměřuje na co nejjednodušší a nejčitelnější syntaxi. Často je preferován pro svou stručnost.
Stejný scénář jako výše, ale s NSubstitute:
// 1. Vytvoření náhrady
var repo = Substitute.For<IUserRepository>();
// 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);
—
| 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<T> | Intuitivní od prvního použití |
—
Související články:
Tagy: programming dot-net testing mock moq nsubstitute csharp