Zrozumienie Asercji w xUnit: Kluczowe Metody i Ich Zastosowanie
Zrozumienie Asercji w xUnit: Kluczowe Metody i Ich Zastosowanie
Przykłady
Assert.All
Metoda Assert.All
sprawdza, czy każdy element kolekcji spełnia określone kryterium wyrażone przez delegat przekazany jako drugi argument.
Prosty przykład:
[Fact] public void AllItemsArePositive() { // Arrange // Tworzenie listy liczb całkowitych var numbers = new List<int> { 1, 2, 3 }; // Act & Assert // Sprawdzenie, czy wszystkie liczby są dodatnie Assert.All(numbers, item => Assert.True(item > 0)); }
Przykład z mockowaniem:
[Fact] public void AllUsersAreAdults() { // Arrange var mockUserRepository = new Mock<IUserRepository>(); // Konfiguracja mocka, aby zwracał listę dorosłych użytkowników mockUserRepository.Setup(repo => repo.GetAllUsers()) .Returns(new List<User> { new User { Age = 21 }, new User { Age = 22 } }); // Tworzenie serwisu z zmockowanym repozytorium var userService = new UserService(mockUserRepository.Object); // Act // Pobranie wszystkich użytkowników var users = userService.GetAllUsers(); // Assert // Sprawdzenie, czy wszyscy użytkownicy są dorośli Assert.All(users, user => Assert.True(user.Age >= 18)); }
Assert.Collection
Assert.Collection
służy do weryfikacji, że kolekcja zawiera elementy spełniające określone warunki w danej kolejności.
Prosty przykład:
[Fact] public void CollectionHasSpecificItems() { // Arrange // Tworzenie listy owoców var fruits = new List<string> { "apple", "banana", "cherry" }; // Act & Assert Assert.Collection(fruits, item => Assert.Equal("apple", item), // Sprawdzenie, czy pierwszy element to "apple" item => Assert.Equal("banana", item), // Sprawdzenie, czy drugi element to "banana" item => Assert.Equal("cherry", item)); // Sprawdzenie, czy trzeci element to "cherry" }
Przykład z mockowaniem:
[Fact] public void UsersHaveSpecificRoles() { // Arrange var mockUserRepository = new Mock<IUserRepository>(); // Konfiguracja mocka, aby zwracał użytkowników z określonymi rolami mockUserRepository .Setup(repo => repo.GetAllUsers()) .Returns(new List<User> { new User { Role = "Admin" }, new User { Role = "User" } }); // Tworzenie serwisu z zmockowanym repozytorium var userService = new UserService(mockUserRepository.Object); // Act // Pobranie wszystkich użytkowników var users = userService.GetAllUsers(); // Assert Assert.Collection(users, user => Assert.Equal("Admin", user.Role), // Sprawdzenie, czy pierwszy użytkownik to admin user => Assert.Equal("User", user.Role)); // Sprawdzenie, czy drugi użytkownik to zwykły użytkownik }
Assert.Contains
Assert.Contains
jest używane do sprawdzenia, czy kolekcja zawiera określony element.
Prosty przykład:
[Fact] public void ListContainsElement() { // Arrange // Tworzenie listy elementów var elements = new List<string> { "apple", "banana", "cherry" }; // Act & Assert // Potwierdzenie, że lista zawiera 'banana' Assert.Contains("banana", elements); }
Przykład z mockowaniem:
[Fact] public void AvailableProductsIncludeProduct() { // Arrange var mockProductRepository = new Mock<IProductRepository>(); // Konfiguracja mocka, aby zwracał produkty mockProductRepository .Setup(repo => repo.GetAllProducts()) .Returns(new List<Product> { new Product { Name = "Laptop" }, new Product { Name = "Phone" } }); // Tworzenie serwisu z zmockowanym repozytorium var productService = new ProductService(mockProductRepository.Object); // Act // Pobranie wszystkich produktów var products = productService.GetAllProducts(); // Assert // Potwierdzenie, że lista produktów zawiera "Laptop" Assert.Contains(products, product => product.Name == "Laptop"); }
Assert.Distinct
Assert.Distinct
sprawdza, czy wszystkie elementy w kolekcji są unikalne.
Prosty przykład:
[Fact] public void NumbersAreUnique() { // Arrange // Tworzenie listy liczb var numbers = new List<int> { 1, 2, 3 }; // Act & Assert // Sprawdzenie, czy wszystkie liczby są unikalne Assert.Distinct(numbers); }
Przykład z mockowaniem:
[Fact] public void UserEmailsAreUnique() { // Arrange var mockUserRepository = new Mock<IUserRepository>(); // Konfiguracja mocka, aby zwracał użytkowników z unikalnymi adresami e-mail mockUserRepository .Setup(repo => repo.GetAllUsers()) .Returns(new List<User> { new User { Email = "user1@example.com" }, new User { Email = "user2@example.com" } }); // Tworzenie serwisu z zmockowanym repozytorium var userService = new UserService(mockUserRepository.Object); // Act // Pobranie e-maili wszystkich użytkowników var emails = userService.GetAllUsers().Select(u => u.Email).ToList(); // Assert // Sprawdzenie, czy wszystkie e-maile są unikalne Assert.Distinct(emails); }
Assert.DoesNotContain
Assert.DoesNotContain
jest używane do sprawdzenia, czy kolekcja nie zawiera określonego elementu.
Prosty przykład:
[Fact] public void ListDoesNotContainElement() { // Arrange // Tworzenie listy elementów var elements = new List<string> { "apple", "banana", "cherry" }; // Act & Assert // Potwierdzenie, że lista nie zawiera 'orange' Assert.DoesNotContain("orange", elements); }
Przykład z mockowaniem:
[Fact] public void DiscontinuedProductsDoNotIncludeProduct() { // Arrange var mockProductRepository = new Mock<IProductRepository>(); // Konfiguracja mocka, aby zwracał wycofane produkty mockProductRepository .Setup(repo => repo.GetDiscontinuedProducts()) .Returns(new List<Product> { new Product { Name = "OldPhone" } }); // Tworzenie serwisu z zmockowanym repozytorium var productService = new ProductService(mockProductRepository.Object); // Act // Pobranie wycofanych produktów var products = productService.GetDiscontinuedProducts(); // Assert // Potwierdzenie, że lista wycofanych produktów nie zawiera "Phone" Assert.DoesNotContain(products, product => product.Name == "Phone"); }
Assert.DoesNotMatch
Assert.DoesNotMatch
sprawdza, czy dany tekst nie pasuje do określonego wzorca wyrażenia regularnego.
Prosty przykład:
[Fact] public void TextDoesNotMatchPattern() { // Arrange // Definiowanie ciągu wejściowego string input = "Hello World!"; // Act & Assert // Sprawdzenie, czy tekst nie pasuje do wzorca (same cyfry) Assert.DoesNotMatch("^[0-9]*$", input); }
Przykład z mockowaniem:
[Fact] public void UsernameDoesNotContainIllegalChars() { // Arrange var mockUser = new Mock<IUser>(); // Konfiguracja mocka zwracającego nazwę użytkownika mockUser.Setup(u => u.Username).Returns("JohnDoe123"); // Act // Pobranie nazwy użytkownika var username = mockUser.Object.Username; // Assert // Sprawdzenie, czy nazwa użytkownika nie zawiera niedozwolonych znaków Assert.DoesNotMatch("[:*?<>|]+", username); }
Assert.Empty
Assert.Empty
służy do weryfikacji, że kolekcja jest pusta.
Prosty przykład:
[Fact] public void ListIsEmpty() { // Arrange // Tworzenie pustej listy elementów var elements = new List<string>(); // Act & Assert // Potwierdzenie, że lista jest pusta Assert.Empty(elements); }
Przykład z mockowaniem:
[Fact] public void NoProductsAvailable() { // Arrange var mockProductRepository = new Mock<IProductRepository>(); // Konfiguracja mocka, aby zwracał pustą listę produktów mockProductRepository .Setup(repo => repo.GetAllProducts()) .Returns(new List<Product>()); // Tworzenie serwisu z zmockowanym repozytorium var productService = new ProductService(mockProductRepository.Object); // Act // Pobranie wszystkich produktów var products = productService.GetAllProducts(); // Assert // Potwierdzenie, że lista produktów jest pusta Assert.Empty(products); }
Assert.EndsWith
Assert.EndsWith
weryfikuje, czy ciąg tekstowy kończy się na określony podciąg.
Prosty przykład:
[Fact] public void StringEndsWithSuffix() { // Arrange // Definiowanie ciągu string value = "unittest"; // Act & Assert // Potwierdzenie, że ciąg kończy się na 'test' Assert.EndsWith("test", value); }
Przykład z mockowaniem:
[Fact] public void FilePathHasCorrectExtension() { // Arrange var mockFile = new Mock<IFile>(); // Konfiguracja mocka zwracającego ścieżkę do pliku mockFile.Setup(f => f.Path).Returns("report.pdf"); // Act // Pobranie ścieżki pliku var path = mockFile.Object.Path; // Assert // Sprawdzenie, czy ścieżka pliku kończy się na .pdf Assert.EndsWith(".pdf", path); }
Assert.Equal
Assert.Equal
sprawdza, czy dwa obiekty są równe.
Prosty przykład:
[Fact] public void ValuesAreEqual() { // Arrange // Oczekiwana wartość int expected = 5; // Act // Rzeczywista wartość int actual = 5; // Assert // Potwierdzenie, że wartości są równe Assert.Equal(expected, actual); }
Przykład z mockowaniem:
[Fact] public void CorrectNumberOfUsersReturned() { // Arrange var mockUserRepository = new Mock<IUserRepository>(); // Konfiguracja mocka, aby zwracał listę dwóch użytkowników mockUserRepository .Setup(repo => repo.GetAllUsers()) .Returns(new List<User> { new User(), new User() }); // Tworzenie serwisu z zmockowanym repozytorium var userService = new UserService(mockUserRepository.Object); // Act // Pobranie wszystkich użytkowników var users = userService.GetAllUsers(); // Assert // Potwierdzenie, że liczba użytkowników wynosi 2 Assert.Equal(2, users.Count); }
Assert.Equivalent
Assert.Equivalent
sprawdza, czy dwie kolekcje zawierają te same elementy, niekoniecznie w tej samej kolejności.
Prosty przykład:
[Fact] public void CollectionsAreEquivalent() { // Arrange var expected = new List<int> { 1, 2, 3 }; // Definiowanie oczekiwanej kolekcji var actual = new List<int> { 3, 1, 2 }; // Definiowanie rzeczywistej kolekcji // Act & Assert Assert.Equivalent(expected, actual); // Potwierdzenie, że kolekcje są równoważne }
Przykład z mockowaniem:
[Fact] public void UserHasCorrectRoles() { // Arrange var mockUser = new Mock<IUser>(); // Konfiguracja mocka zwracającego role użytkownika mockUser.Setup(u => u.Roles).Returns(new List<string> { "admin", "user" }); // Definiowanie oczekiwanych ról var expectedRoles = new List<string> { "user", "admin" }; // Act // Pobranie ról użytkownika var roles = mockUser.Object.Roles; // Assert // Sprawdzenie, czy użytkownik ma odpowiednie role Assert.Equivalent(expectedRoles, roles); }